在实现web应用程序的主要功能后,在该应用程序中实现安全性是合理的


It is reasonable to implement security in a web app after implementing its main features?

如果这似乎太模糊,无法发布在Stackoverflow上,请原谅。

我的公司雇佣了三名开发人员来实现一个分类广告系统,使用PHP和MySQL。他们已经工作了一个多月,没有使用框架(他们反对使用框架),并且已经实现了基本功能(用户注册和身份验证、广告列表和过滤等)。然而,粗略的测试表明,该系统容易受到常见的恶意攻击(CSRF、XSS、本地文件包含)。

在检查了代码后,我意识到他们没有在服务器端实现数据验证过程(他们只使用正则表达式来验证邮件地址,并使用mysqli_real_escape_string()来针对SQL注入对字符串进行清理)。他们实现了一些验证例程,但在客户端使用JavaScript。显然,这是UI的一部分,不能提供任何针对恶意用户的安全性。

他们认为,由于三名开发人员不足以从头开始开发一个完整的网络应用程序(我同意),他们将首先实现功能,然后适当地保护它们,以满足特定的截止日期。无论如何,我都不是一个经验丰富的程序员,但我相信实现安全性需要更长的时间。此外,如果他们设法做到这一点,与从一开始就实现的数据净化例程相比,这将是不合格的。

所以,我的问题是:(i)在实现功能之后实现安全性(即,至少实现适当的净化例程)是否合理?(ii)如果(i)的答案是"否",你会建议管理安全处理不力的项目使用什么参考书目、安全框架(但我猜它们嵌入了web框架中)等?

不,由于多种原因,在项目完成后实施安全性是不可接受的。首先,正如已经提到的那样,无论谁来买单,当他们已经拥有了想要的产品时,都不太可能继续付费来实现安全功能。第二个原因是,与第一次正确编码并在编写代码时实施任何安全措施相比,他们需要更长的时间来检查并尝试发现所有安全漏洞。这样做也会更容易,因为你可以编写安全库,为你做转义数据之类的事情,这样通过对转义函数/方法进行简单调用来编写代码就变得流畅了。第三个原因是,他们绝对不可能通过回顾代码来发现所有漏洞。在没有安全漏洞的情况下编写代码已经够难的了(几乎是不可能的),更不用说回头查看并发现所有这些安全漏洞了。

至于建议的框架,我真的没有,因为我也从来没有使用过框架,只有我过去写过的库可以使用。然而,这归结为寻找优秀的开发人员,而不是那些说他们可以以超低的价格完成这项工作的开发人员。PHP开发人员库中充满了这些半吊子的开发人员,我想说他们中有相当一部分人更喜欢预制框架。诀窍是从一开始就找到一些好的。要保护这样写得不好的应用程序,唯一的选择就是获得WAF(web应用程序防火墙),并让它过滤发送到服务器的任何恶意内容。不过,对于写得不好的代码来说,这并不是一颗银弹。我甚至不会称它为创可贴,更像是一个冰雹玛丽。

最后一件事是,我非常不同意他们人手不足,有三个人写这篇文章。4年前,我在不到3个月的时间里自己写了一些类似的东西(好吧,有一个html家伙)。这3个月中有两个月是完全重写部分,因为一旦内容完成,客户就会改变主意,再加上写一些附带功能,使其更像是一个社交网络,而不是一个机密网站。如果我能在这么长的时间内自己完成大部分工作,他们应该能够在一个半月内与3个人一起轻松完成(并确保)。

以后实现安全性确实不合理。

它可能不会花更长的时间或低于标准,它可能会更快更好。问题是,它可能根本不会完成,因为该项目将迟到并超出预算。

我对不使用框架的决定感到惊讶,这看起来像是一个人一周的工作,使用Rails、Symfony或Django,安全性会受到影响。

在开发阶段,应始终考虑安全性,如果过度关注/忽视了安全性,则应在第一个可用实例上构建开发中对API的改进。

您最不想做的事情就是向公众发布一个脚本,该脚本本身的代码结构中存在许多安全/恶意漏洞。

因此,我建议通知这些开发人员查看他们的工作,并对已经制作的API进行适当的更改,以提高安全性。

如果忽视安全方面而不修改,该项目可能会延迟完成,超出预算。。最好在为时已晚之前(当你向公共交通发布并面临比预期更长的停机时间时)直接处理

总体观点。。在它成为一个严重的问题之前,把它钉在屁股上。

在开发的后期处理安全问题并非没有道理,只要这只是一个实现问题,而不是设计中的根本缺陷。不存在"更安全"或"更不安全"这两个词。一个系统要么安全,要么不安全。必须将应用程序的行为视为一个整体。因此,在代码库仍在变化的情况下处理安全性并不是那么有利可图。虽然现在流行的说法是,安全应该是整个开发过程中不可或缺的一部分,但在一个资源有限的世界里,这种方法更具学术性而非实用性。在交付前有足够的时间进行质量保证,很可能会产生更好的回报。

为了添加其他人的建议,您必须从第一天起就接受安全性。

不这样做只会导致代码中出现错误和bug。

查看Microsoft安全开发生命周期:

http://www.microsoft.com/security/sdl/default.aspx

此外,我建议您查看代码/测试它,以确定任何潜在的问题。

谢谢法维奥@fcerullo