本文章是由機器翻譯。

安全簡報

使用 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