网络应用程序安全指南/杂项
本节包含一些关于网络应用程序的一般安全提示。
始终牢记
- 不要依赖 Web 应用防火墙来保证安全(但是,考虑使用它们来提高安全性)
- 如果使用外部库(例如用于数据库访问、XML 解析),请始终使用最新版本
- 如果需要随机数,请从安全/加密的随机数生成器中获取
- 对于每次操作或数据检索,始终检查访问权限
- 在任何情况下,不要尝试自己实现加密算法。使用高级库进行加密。
- 确保调试输出和错误消息不会泄漏敏感信息
- 在代码中标记有问题的调试输出(例如
//TODO DEBUG REMOVE
),即使您打算在测试后立即删除它 - 不要使用“
eval()
”和类似函数- 尽可能避免使用“
system()
”和类似函数
- 尽可能避免使用“
- 确保数据库服务器无法从外部直接访问
- 考虑阻止旧浏览器使用您的应用程序
原理
Web 应用防火墙(WAF)可以防止现有安全漏洞被利用。它们会使攻击您的网络应用程序变得更加困难和烦人,从而增加非目标攻击者转向其他目标的可能性。但是,它们通常可以被有决心的攻击者绕过。您真正的防御是保护您的应用程序。WAF 旨在提供一些额外的保护,以防止在执行此操作时出错。拥有 Web 应用防火墙并不意味着您可以忽略保护应用程序的安全。未针对特定应用程序精确调整的 WAF 通常会阻止合法请求,同时放行攻击/允许绕过。这对于经常使用的 mod_security 的免费核心规则集尤其如此。
过时的库版本可能包含安全问题。
如果使用低质量的随机数,例如用于生成密码重置令牌,攻击者可能能够猜测其值并绕过安全措施。
不在每一步都检查访问权限会导致严重的漏洞,例如用户可以查看他们无权查看的数据(例如,会员数据库应该显示已登录会员的信息,更改 URL 中的 ID 由于缺少检查,会导致其他成员的信息泄露)。
加密非常复杂,即使是加密专家也很难避免或发现错误。安全的密码是由多个专家经过数月的努力开发,并由数百位专家审查的。不要尝试发明安全的密码。也不要尝试实现现有的密码,因为错误可能不会被发现,并会导致您的结果不安全。使用现有的、可靠的库。
调试输出和错误消息可以为攻击者提供有价值的信息。值得注意的是,有多个实例证明以下形式的调试输出损害了安全性:“提供的令牌 1234 无效,预期值为 5678”(攻击者获得了正确的答案,他只需要在下一次尝试中提供它)。对于生产版本,通常应该抑制错误消息的显示。考虑替换 HTTP 错误页面,以隐藏路径等基本信息。
标记任何应该删除的调试输出,以确保您不会忘记删除它,只需在发布前搜索“TODO”和“REMOVE”即可。养成始终标记它的习惯,即使您打算“立即”删除它。您可能随时会分心并忘记。
通过“eval()
”和类似函数使用动态代码通常是不必要的,微小的错误往往会导致代码注入问题。因此,应该避免这些危险的函数。这同样适用于“system()
”,但是,这并非总是可以避免。如果使用,则必须正确转义“system()
”的输入,当然,可以使用现有的 shell 转义函数或自动转义参数的函数。
保持数据库服务器无法从外部访问,例如,如果它们与网络应用程序运行在同一台机器上,则将其绑定到 127.0.0.1,或者使用具有 IP 白名单的防火墙,可以防止攻击者使用窃取的数据库密码来实际访问数据库。
不再受供应商支持的浏览器往往存在严重的安全问题。它们是客户维护不良的标志,很容易受到恶意软件攻击,并且通常缺少与网络应用程序相关的安全功能。可以使用 User-Agent 标头进行阻止,或者对于 IE 使用条件注释。阻止过时的浏览器可以迫使客户端使用安全浏览器;但是,它可能会阻止无法更新浏览器的用户使用应用程序。除非您知道所有客户端都应该使用 IE8 或更高版本,否则不建议阻止比 IE6 新的任何内容。请注意,Mozilla Firefox 3.6.x 分支仍然受支持(截至 2011 年 9 月),而 Firefox 4 分支不受支持。显然,有意阻止旧浏览器主要与需要非常高安全性的网络应用程序相关。