跳转到内容

网络应用程序安全指南/杂项

来自维基教科书,开放世界中的开放书籍

杂项

本节包含一些关于网络应用程序的一般安全提示。

始终牢记

  • 不要依赖 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 分支不受支持。显然,有意阻止旧浏览器主要与需要非常高安全性的网络应用程序相关。

华夏公益教科书