Web 应用程序安全威胁概述
更新:2007 年 11 月
如果未知用户可以访问您的 Web 应用程序,则几乎可以确定恶意用户将尝试获取对您的应用程序的未经授权的访问。对于允许公众在 Internet 上访问的服务器,总会不断有人探测其是否存在安全漏洞。因此,建议您做好预防措施,并在所有 Web 应用程序中建立安全系统。
有关编写安全代码和保护应用程序的最佳做法的更详细信息,请参见 Michael Howard 和 David LeBlanc 合著的“Writing Secure Code”(《编写安全代码》)一书,也可以参见“Microsoft Patterns and Practices”(Microsoft 模式与实践)中提供的指南。
安全性技术只是解决方案的一部分
实现安全性只是解决方案的一部分。另一个重要部分是警惕性。即使您的系统具有许多安全性保护措施,您也需要以下列方式严密地监视它:
监视您系统的事件日志。监视对系统的重复登录尝试或对 Web 服务器的过多请求。
使用 Microsoft Windows 和 Internet 信息服务 (IIS) 的最新安全更新,以及其他任何 Microsoft SQL Server 更新或应用程序可能使用的其他数据源更新,使应用程序服务器持续处于最新的状态。
威胁模型
开发更安全的应用程序的重要部分是了解对它的威胁。Microsoft 已经开发了一种对威胁进行分类的方法:电子欺骗、窜改、否认、信息泄露、拒绝服务和特权升级 (STRIDE)。以下几节将简要说明这些威胁以及它们如何应用于 Web 应用程序。
电子欺骗
“电子欺骗”是指以未经授权的方式模拟用户或进程。简单讲,电子欺骗可以是指键入其他用户的凭据。恶意使用还可能更改 Cookie 的内容以假装他(或她)是其他用户或 Cookie 来自其他服务器。
一般来说,您可以通过使用严格的身份验证防止电子欺骗。每当有人请求访问非公共信息时,都要确保他们的身份与所声称的一致。您还可以通过对凭据信息采取安全措施来防止电子欺骗。例如,不将密码或其他敏感信息保存在 Cookie 中,因为恶意用户可以轻松地在其中找到或修改它。
篡改
“篡改”是指在未经授权的情况下更改或删除资源。例如,恶意用户进入您的站点并更改文件,从而使网页变得面目全非。进行篡改的间接方法是使用脚本利用。恶意用户设法获取要执行的代码(脚本),方法是将其屏蔽为页面中的用户输入或屏蔽为链接。
防止篡改的主要方法是使用 Windows 安全性锁定文件、目录和其他 Windows 资源。应用程序还应使用最少的特权运行。不信任来自用户甚至数据库的任何信息有助于防止脚本利用。每当您从不可信的信息源获得信息时,都要采取步骤确保它不包含任何可执行代码。
否认
“否认”威胁是指在进行事务处理时,在事务处理涉及的主体作出事务处理的事实后无法进行证明。在 Web 应用程序中,这可以是模拟无辜用户的凭据。您可以使用严格的身份验证来防止否认。另外,使用 Windows 的日志记录功能来保存服务器上任何活动的审核追踪。
信息泄露
“信息泄露”仅指偷窃或泄露应该保密的信息。一个典型的示例是偷窃密码,但信息泄露可以涉及对服务器上的任何文件或资源的访问。
防止信息泄露的最佳方法是没有要泄露的信息。例如,如果您不存储密码,恶意用户就无法窃取。存储密码的另一种方法是只存储密码的哈希。当用户提供凭据时,您可以散列用户的密码并仅比较二者的哈希。如果您确实要存储敏感信息,请使用 Windows 安全性以确保其安全。就像始终采取的操作一样,您应该使用身份验证来确保只有经过授权的用户能够访问受限制的信息。如果必须公开敏感信息,建议您在存储信息时将其加密,并使用安全套接字层 (SSL) 在将此信息发送到浏览器或从浏览器发送时将其加密。
拒绝服务
“拒绝服务”攻击是指故意导致应用程序的可用性降低。典型的示例是:让 Web 应用程序负载过度,使其无法为普通用户服务。或者,恶意用户可能只是试图导致您的服务器出现故障。
使用 IIS,您可以调节应用程序,即,它会限制将为其提供服务的请求的数量。您也许能够拒绝已知的恶意用户或 IP 地址的访问。保持应用程序联机就是要运行强大的代码。应该全面测试您的应用程序,并在可能的地方对出现的错误条件作出适当的响应。
特权升级
“特权升级”攻击是指使用恶意手段获取比正常分配的权限更多的权限。例如,在成功的特权升级攻击中,恶意用户设法获取对 Web 服务器的管理权限,使其能够访问服务器上的任何数据以及控制服务器功能。
若要帮助防止特权升级,请在最少特权的上下文中运行应用程序(如果切实可行)。例如,建议您不要以 SYSTEM(管理)用户身份运行 ASP.NET 应用程序。