安全简报

使用 Visual Studio 2010 代码分析提高 ASP.NET 的安全性

Sacha Faust

做 ASP.NET 开发的任何人可能都会承认(公开或不公开)在他们职业生涯的某个时候引入或遇到过安全问题。 迫于压力,开发人员经常需尽可能快速地交付代码,而且平台的复杂性和大量配置选项经常使应用程序达不到预期的安全状态。 此外,调试和生产的配置要求不同,这样通常会在生产中引入调试设置,从而引发各种问题。

这些年来,ASP.NET 平台已逐渐成熟,而且通过 MSDN 和社区博客发布的文档越来越好,但是了解要使用哪个功能或配置设置通常有些麻烦。 即使您非常了解安全功能,错误也时常会发生,从而可能导致您的应用程序中出现安全漏洞。

同行代码审查是一个有用过程,也是及早发现问题的好方法。 当然,不是每个人都有时间或预算,或身边有知识渊博的同行进行这种审查。

自从在 Visual Studio 2005 中引入了代码分析,开发人员就能够自动分析其代码,以从设计、可维护性、性能和安全性的范围查看代码是否符合一系列最佳做法。 迄今为止,代码分析已成为一种强大的工具,但它直到现在还未将重点放在为 ASP.NET 提供最佳安全做法指南上面。

在本文中,我将向您介绍新的 ASP.NET 代码分析规则,此规则可用于 Visual Studio 代码分析以及独立 FxCop 应用程序,以提高 ASP.NET 应用程序的安全性。

概述

您可以从 go.microsoft.com/?linkid=9750555 下载用于 Visual Studio 2010 和 FxCop 版本 10.0 的 ASP.NET 安全代码分析规则包。 此安装包含三个新规则包:

  • ASP.NET.Security: 此类别重点介绍与如何初始化 System.Web.Ui.Page 属性相关的最佳安全做法。
  • ASP.NET.MVC.Security: 此类别重点介绍与如何使用 ASP.NET MVC 相关的最佳安全做法。
  • ASP.NET.Security.Configuration: 此类别重点介绍与 web.config 文件下的配置元素相关的最佳安全做法。

安装规则包后,通过单击“生成”菜单下的“对网站运行代码分析”按钮,您可以开始对 Web 应用程序安全性的自动审查(请参见图 1)。 此分析将根据 ASP.NET 的一系列最佳安全做法,对应用程序的每个 Page 类和 web.config 文件进行审查。

图 1 对示例网站运行代码分析

例如,Web 应用程序中一个普遍的安全漏洞是跨站点请求伪造,这让攻击者能够以另一个用户的身份执行命令。 此漏洞的常见缓解操作是使用 Page.ViewStateUserKey 属性 (bit.ly/cTSHM0)。 您还可以采用 ASP.NET MVC 中的 AntiForgeryToken (bit.ly/ciiQIP)。 两种技术都能防止对应用程序的恶意重播攻击。 代码分析将确保在应用程序中采用适当的缓解操作。

我从第一次运行代码分析的开发人员那里听到的常见反馈是说,返回的警告数量太多(请参见图 2)。 开发人员很容易认为需要自己找出修复所有警告的方法。

图 2 在“错误列表”的“警告”选项卡上列出冲突

为了消除修复每个警告的一些负担,每条规则都明确指示了需要修复的内容和修复方法,以及一些可提供应用更改之前所需的详细信息的参考(请参见图 3)。

图 3 “警告”部分中的详细信息

通过单击“网站”|“配置网站的代码分析”,然后选中“生成时启用代码分析(定义 CODE_ANALYSIS 常量)”选项,还可将代码分析配置为在每次生成后运行(请参见图 4)。

图 4 生成过程中启用代码分析

使用 FxCop 进行代码分析

仅在 Visual Studio 高级专业版和旗舰版中提供代码分析功能。 但您还可以使用独立的 FxCop 工具执行 ASP.NET 代码分析。 FxCop 作为 Windows SDK 的一部分提供。 Windows SDK 7.1 版本可从 bit.ly/dzCizq 中获得。

在使用标准 FxCop 工具时,执行分析需要一些额外的工作。 我将指导您逐步执行相应步骤来完成工作。

通常,在您编译 Web 项目时,页面标记(未包含在代码隐藏文件中的页面代码)不进行编译,并完整保留在应用程序的 Web 根中。 当第一个用户请求页面时,标记将编译到单独的程序集中。 这样就能在无需重新编译其他任何内容的情况下更新网站。 (有关 ASP.NET 页面编译过程的详细信息,请参阅 msdn.microsoft.com/library/ms366723。)

因为并不是所有代码都自动进行编译,所以在分析期间有些代码不可见,而且可能会遗漏重要的安全问题。 为了确保分析期间所有代码均可用,您需要强制预编译所有页面。 可通过使用“发布网站”工具(可通过单击“生成”|“公共网站”启动)实现预编译。 利用此工具,您可以配置发布网站的方式,也可以在此工具中启用预编译。 只需取消选中“允许更新此预编译站点”选项并单击“确定”即可(请参见图 5)。 这将生成准备进行分析的完全编译的网站。

图 5 发布预编译的网站

既然您有一个完全编译的网站,就请在该网站上充分利用 FxCop。

ASP.NET 分析需要只在 FxCop 的命令行版本中提供的功能,以便打开命令提示符,并导航到 FxCop 安装。 很可能将出现以下情况之一,具体取决于您运行的 Windows 是 32 位版本还是 64 位版本:

C:\Program Files (x86)\Microsoft FxCop 10.0
  C:\Program Files\Microsoft FxCop 10.0

从 FxCop 文件夹可运行 Fxcopcmd.exe 以启动代码分析。 对于 ASP.NET 网站,您只需使用如下命令:

fxcopcmd.exe /file:"H:\MSDN\PrecompiledWeb\
    MSDNSampleSite\bin" /rule:
    AspNetConfigurationSecurityRules.dll 
    /rule:AspNetMvcSecurityRules.dll 
    /rule:ASPNetSecurityRules.dll /aspnet /console

让我们来看一看这些命令,以便您了解我正在使用的选项。

/file 选项指示要分析的程序集。 在此示例中,我的预编译网站程序集位于 H:\MSDN\PrecompiledWeb\MSDNSampleSite\bin 下。

/rule 选项指示分析期间要使用的规则。 对于本示例,我只使用三个 ASP.NET 安全规则:AspNetConfigurationSecurityRules.dll、AspNetMvcSecurityRules.dll 和 ASPNetSecurityRules.dll。

/aspnet 选项启用 ASP.NET 分析,而 /console 选项将分析输出定向到命令窗口。 您可在图 6 中查看结果。 可在 msdn.microsoft.com/library/bb429474(VS.80) 中找到有关 Fxcopcmd 及其各种选项的详细信息。

图 6 使用 Fxcopcmd.exe 运行 ASP.NET 规则

总结

使 ASP.NET 网站更加安全是一项艰难的任务,但 ASP.NET 安全代码分析规则通过识别一些重要威胁为您做了大量工作。 正如您在本文中所看到的,这个过程简单,并可配置为每次生成时运行,从而使您及早识别问题。

建议将这些规则部署到每个开发人员的计算机中,并将它们作为 Team Foundation Sever 或其他存储库签入策略的一部分进行添加。 这样使各个开发人员能够在生成时验证其代码,并强制执行此策略,以便所有的代码都符合最佳实践。

您也可以实现您自己的自定义代码分析规则。 如果您有兴趣采用这种途径,请参阅 Duke Kamstra 在“代码分析团队博客”(bit.ly/blpP38) 上发表的一篇博客中提供的一些有用信息。 在 Tatham Oddie 的博客 (bit.ly/5tFrMw) 中,您还可以找到有用的演练过程。

Sacha Faust是 Microsoft Office 365 平台团队的开发人员。您可以在 blogs.msdn.com/b/sfaust 中找到 Faust 的文章。

衷心感谢以下技术专家对本文的审阅:Bryan Sullivan