2

如果这看起来太模糊而无法在 Stackoverflow 上发布,请原谅。

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

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

他们争辩说,由于三个开发人员不足以从头开始开发一个完整的 web 应用程序(我同意),他们将首先实现功能,然后正确地保护它们,以满足某些期限。无论如何,我都不是经验丰富的程序员,但我相信实现安全性需要更长时间。此外,如果他们设法以某种方式做到这一点,与从一开始就实施的数据清理例程相比,这将是低于标准的。

所以,我的问题是:(i)在实现功能之后实现安全性(即,至少实现适当的清理程序)是否合理?(ii) 如果 (i) 的答案是“否”,您会推荐哪些参考书目、安全框架(但我猜它们本身就嵌入在 Web 框架中)等来管理安全处理不当的项目?

4

5 回答 5

3

以后再实施安全确实不合理。

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

我对不使用框架的决定感到惊讶,这看起来像是使用 Rails、Symfony 或 Django 完成的 1 人周工作,而且安全性会被考虑在内。

于 2013-02-26T00:45:53.493 回答
3

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

至于建议的框架,我真的没有,因为我也从未使用过框架,只有我过去编写的库可以使用。然而,这归结为只是找到优秀的开发人员,而不是那些说他们可以以超低的价格完成它的人。PHP 开发人员池充满了这些半途而废的开发人员,我想说他们中的相当一部分人更喜欢预制框架。诀窍是从一开始就找到一些好的。要保护这样写得不好的应用程序,您真正拥有的唯一选择是获取 WAF(Web 应用程序防火墙)并让它过滤任何发送到服务器的恶意内容。尽管对于编写不佳的代码来说,这不是灵丹妙药。我什至不会称它为创可贴,更像是冰雹。

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

于 2013-02-26T01:17:31.263 回答
2

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

您要做的最后一件事是向公众发布一个脚本,该脚本在其代码结构中存在许多安全/恶意漏洞。

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

如果安全方面被忽视并且没有修改,该项目可能会延迟完成并且超出预算。最好在为时已晚之前解决这个问题(当您已经发布到公共交通并且面临比预期更长的停机时间时)

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

于 2013-02-26T00:51:32.880 回答
0

在开发的后期处理安全问题并没有什么不合理,只要只是实现的问题,而不是设计的根本缺陷。没有“更安全”或“更不安全”之类的东西。系统要么是安全的,要么不是。必须将应用程序的行为作为一个整体来考虑。因此,在代码库仍在不断变化时处理安全性并不是那么有利可图。虽然说安全应该是整个开发过程不可或缺的一部分是一种时髦的说法,但在资源有限的世界中,这种方法更多的是学术而非实用。在交付之前有足够的时间进行质量保证很可能会产生更好的回报。

于 2013-02-26T01:30:15.873 回答
0

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

不这样做只会容易出现代码中的错误和错误。

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

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

另外,我建议您查看代码/对其进行渗透测试以识别任何潜在问题。

谢谢法比奥@fcerullo

于 2013-02-26T13:37:07.543 回答