有趣的问题!我想从概率的角度来回答这个问题,而不是从最佳当前实践的角度来回答。
虽然 Thomas 和其他人提供了很好的答案,但我认为他们没有触及核心问题——即“在实践中,独特(或较少使用的)代码比流行代码更具弹性”。请注意,我故意不使用“比流行代码更安全”。归结为“通过默默无闻的安全工作”的特殊情况?
而且(我知道这不会是流行的答案)我认为当我们用“弹性”替换“安全”时,答案实际上可能并不总是被普遍接受“从不!”
它表明它可能不太安全(意思是:很可能您自己的安全代码比以前经历过许多攻击并且由比您更聪明的人修复的流行代码更容易/更快地破解)。
但是,除非您是大型/受欢迎的站点,否则如果潜在的破解者不能重用破解您所花费的代码/努力,那么您对他们的兴趣就会大大降低,而且这种努力并非微不足道(意思是,您的网站不会崩溃自动参数非验证/SQL注入探测)。如果您被专门针对(工业间谍活动等),这显然不起作用,但当时绝大多数攻击实际上似乎是针对流行软件的自动探测。
因此,如果问题不是“哪个更安全”,而是“哪个不太可能被破解”,那么答案实际上可能是“取决于情况”。这里有几个例子:
示例 1:想象一下 Microsoft windows 8.1(或现在流行的任何东西)计算机,目前没有已知的安全漏洞,购买但从未更新,连接到 Internet。还可以想象几十年前的 Windows 3.11,带有 winsock,从未打过补丁,已知有数百个安全漏洞,连接到 Internet。两者的使用方式相同。出于讨论访问质量的目的而忽略...问题是,哪个会更早被破解?
虽然很明显 3.11 的安全性要低得多,但几乎没有任何针对它的漏洞利用。因此,在 3.11 遇到一些能够在其上运行的古老漏洞之前,很可能会有大受欢迎的 0-day 漏洞攻击 8.1。
示例 2:假设您在一台 Web 服务器上安装了最新的 Joomla CMS,当前没有已知的漏洞利用,并且手工制作的 perl 脚本在执行 CMS 类似的事情,具有已知的可利用漏洞(但对于当前可用的自动化测试没有可疑的漏洞)。一年后,哪个更有机会被利用?
虽然轶事证据表明,在过去几十年我遇到的几十个(到数百个)案例中,大多数情况下流行的软件都被利用了,而过时的软件至今仍不受干扰地继续运行。
另一个值得考虑的事情:
- 如果流行的软件会自动更新(或者管理员总是及时更新),那么这种流行代码的弱点就会大大减少(但并没有消除,由于 0-day 和未发布的漏洞利用),因此具有很大的优势
- 相反,如果软件不接受维护,那么不受欢迎的软件(比如自己编写的)实际上可能不太容易出现问题
- 责备 - 使用流行的软件通常可能是有利的。如果半个世界都受到影响,那么你受到的责备几乎不会像你是一个程序员那样受到责备。如果使用金钱,这一点尤其重要。在安全性较低但能够转移责任的情况下,通常“更好”,而不是更安全但在漏洞利用确实受到攻击时必须自己承担成本。
- 工作 - 其他人已经提到,流行软件在绝大多数情况下会自行修复,您只需要更新 - 这比自己实际查找和修复错误要少得多(但仍需要一些维护)
- 自写软件的另一个优势通常是减少大量代码(导致更少的错误),因为您通常不需要大部分功能或可定制性。例如,人们会使用 Joomla,即使他们需要的只是简单的“模板新闻网站”,实际上这可以用几十行代码来完成。即使您作为程序员的能力不如在流行软件上工作的有成就的人的一半(因此您每行代码的错误数量明显更多),由于具有数量级,您通常仍然可以大获全胜(或很少!)编写/维护的代码更少