即使您對應用程序安全性的體驗和了解非常有限,也應采取一些基本措施來(lái)保護您的 Web 應用程序。本主題的以下各部分提供了適用于所有 Web 應用程序的最低安全性準則。有關(guān)編寫(xiě)安全代碼和確保應用程序安全的最佳做法的更多詳細信息,請參見(jiàn)由 Michael Howard 和 David LeBlanc 編寫(xiě)的書(shū)籍《編寫(xiě)安全代碼》以及由“Microsoft Patterns and Practices”(Microsoft 模式和實(shí)踐)提供的指導。
常規 Web 應用程序安全性建議
如果惡意用戶(hù)可以使用簡(jiǎn)單方法進(jìn)入您的計算機,即使是最精心設計的應用程序安全性也會(huì )失敗。常規 Web 應用程序安全性建議包括以下內容:
-
經(jīng)常備份數據,并將備份存放在安全的場(chǎng)所。
-
將您的 Web 服務(wù)器放置在安全的場(chǎng)所,使未經(jīng)授權的用戶(hù)無(wú)法訪(fǎng)問(wèn)它、關(guān)閉它、帶走它,等等。
-
使用 Windows NTFS 文件系統,不使用 FAT32。NTFS 的安全性比 FAT32 高得多。有關(guān)詳細信息,請參見(jiàn) Windows 幫助文檔。
-
使用不易破解的密碼,保護 Web 服務(wù)器和同一網(wǎng)絡(luò )上的所有計算機的安全。
-
遵循用于確保 Internet 信息服務(wù) (IIS) 安全的最佳做法。有關(guān)詳細信息,請參見(jiàn)“Windows Server TechCenter for IIS”(用于 IIS 的 Windows Server TechCenter)。
-
關(guān)閉任何不使用的端口并關(guān)閉不使用的服務(wù)。
-
運行監視網(wǎng)站通信量的病毒檢查程序。
-
使用防火墻。有關(guān)建議,請參見(jiàn) Microsoft 安全網(wǎng)站上的“Microsoft Firewall Guidelines”(Microsoft 防火墻準則)。
-
了解和安裝來(lái)自 Microsoft 和其他供應商的最新安全更新。
-
使用 Windows 事件日志記錄,并且經(jīng)常檢查這些日志,以查找可疑活動(dòng)。這樣的活動(dòng)包括:反復嘗試登錄您的系統,以及向您的 Web 服務(wù)器發(fā)出數量巨大的請求。
使用最少特權運行應用程序
當您的應用程序運行時(shí),它運行在一個(gè)具有本地計算機(還可能是遠程計算機)的特定特權的上下文中。有關(guān)配置應用程序標識的信息,請參見(jiàn) 配置 ASP.NET 進(jìn)程標識。
若要以最少特權運行,請遵循以下準則:
-
不要以系統用戶(hù)(管理員)身份運行應用程序。
-
在具有最少實(shí)用特權的用戶(hù)上下文中運行應用程序。
-
設置應用程序所需的所有資源上的權限(ACL 或訪(fǎng)問(wèn)控制列表)。使用最嚴格的設置。例如,如果在您的應用程序中是可行的,則將文件設置為只讀。有關(guān) ASP.NET 應用程序標識所需的最少 ACL 權限的列表,請參見(jiàn) ASP.NET 必需的訪(fǎng)問(wèn)控制列表 (ACL)。
-
將您的 Web 應用程序的文件保存在應用程序根目錄下的一個(gè)文件夾中。不要讓用戶(hù)指定在應用程序中進(jìn)行文件訪(fǎng)問(wèn)的路徑。這樣有助于防止用戶(hù)訪(fǎng)問(wèn)服務(wù)器的根目錄。
了解您的用戶(hù)
在許多應用程序中,用戶(hù)有可能不必提供憑據即可訪(fǎng)問(wèn)網(wǎng)站。如果是這樣,則您的應用程序通過(guò)在預定義用戶(hù)的上下文中運行即可訪(fǎng)問(wèn)資源。默認情況下,此上下文是 Web 服務(wù)器上的本地 ASPNET 用戶(hù)(Windows 2000 或 Windows XP)或 NETWORK SERVICE 用戶(hù) (Windows Server 2003)。
若要僅允許已授權用戶(hù)進(jìn)行訪(fǎng)問(wèn),請遵循以下準則:
-
如果您的應用程序是 Intranet 應用程序,則將其配置為使用 Windows 集成安全性。這樣,用戶(hù)的登錄憑據就可以用于訪(fǎng)問(wèn)資源。
-
如果您需要從用戶(hù)收集憑據,則使用其中一種 ASP.NET 身份驗證策略。有關(guān)示例,請參見(jiàn) ASP.NET Forms 身份驗證概述。
防止惡意用戶(hù)的輸入
通常,決不假定從用戶(hù)獲得的輸入是安全的。對惡意用戶(hù)來(lái)說(shuō),從客戶(hù)端向您的應用程序發(fā)送潛在危險的信息是很容易的。若要幫助防止惡意輸入,請遵循以下準則:
-
在窗體中,篩選用戶(hù)輸入以查找 HTML 標記,其中可能包含腳本。有關(guān)詳細信息,請參見(jiàn) 如何:通過(guò)對字符串應用 HTML 編碼在 Web 應用程序中防止腳本侵入。
-
決不回顯(顯示)未經(jīng)篩選的用戶(hù)輸入。在顯示不受信任的信息之前,對 HTML 進(jìn)行編碼以將潛在有害的腳本轉換為顯示字符串。
-
類(lèi)似地,決不將未經(jīng)篩選的用戶(hù)輸入存儲在數據庫中。
-
如果要接受來(lái)自用戶(hù)的一些 HTML,則手動(dòng)篩選它。在您的篩選器中,顯式定義將要接受的內容。不要創(chuàng )建一個(gè)試圖篩選出惡意輸入的篩選器;因為預料到所有可能的惡意輸入是非常困難的。
-
不要假定您從標頭(通常通過(guò) Request 對象)獲得的信息是安全的。對查詢(xún)字符串、Cookie 等采取安全措施。注意,瀏覽器向服務(wù)器報告的信息(用戶(hù)代理信息)可以被假冒(如果此信息在您的應用程序中相當重要)。
-
如有可能,不要將敏感信息(如隱藏字段或 Cookie)存儲在可從瀏覽器訪(fǎng)問(wèn)的位置。例如,不要將密碼存儲在 Cookie 中。
注意
視圖狀態(tài)是以編碼格式存儲在隱藏字段中的。默認情況下,它包含消息身份驗證代碼 (MAC),這樣頁(yè)可以確定視圖狀態(tài)是否已被篡改。
安全地訪(fǎng)問(wèn)數據庫
數據庫通常具有它們自己的安全性。Web 應用程序安全性的一個(gè)重要方面是設計一種應用程序安全地訪(fǎng)問(wèn)數據庫的方式。請遵循這些指導:
-
使用數據庫的內在安全性來(lái)限制可以訪(fǎng)問(wèn)數據庫資源的人員。確切的策略取決于您的數據庫和應用程序:
-
如果在您的應用程序中切實(shí)可行,請使用 Windows 集成安全性以便只有 Windows 授權的用戶(hù)才能訪(fǎng)問(wèn)數據庫。集成安全性比使用 SQL Server 標準安全性更安全。
-
如果您的應用程序使用匿名訪(fǎng)問(wèn),請創(chuàng )建具有非常有限的權限的單個(gè)用戶(hù),并以此用戶(hù)身份連接來(lái)執行查詢(xún)。
-
不要通過(guò)串聯(lián)涉及用戶(hù)輸入的字符串創(chuàng )建 SQL 語(yǔ)句。相反,創(chuàng )建參數化查詢(xún)并使用用戶(hù)輸入設置參數值。
如果您必須將用戶(hù)名和密碼存儲在某個(gè)位置以用作數據庫登錄憑據,請安全地存儲它們。如果可行,請對它們進(jìn)行加密或計算哈希值。有關(guān)詳細信息,請參見(jiàn)加密和解密數據。
有關(guān)安全地訪(fǎng)問(wèn)數據的更多信息,請參見(jiàn)保證 ADO.NET 應用程序的安全。
創(chuàng )建安全的錯誤消息
如果您不小心,惡意用戶(hù)就可以從應用程序顯示的錯誤消息推斷出有關(guān)您的應用程序的重要信息。請遵循這些指導:
-
不要編寫(xiě)會(huì )回顯可能對惡意用戶(hù)有用的信息(例如用戶(hù)名)的錯誤消息。
-
將應用程序配置為不向用戶(hù)顯示詳細錯誤。如果為進(jìn)行調試而要顯示詳細錯誤消息,請先檢查該用戶(hù)是否為 Web 服務(wù)器的本地用戶(hù)。有關(guān)詳細信息,請參見(jiàn)如何:顯示安全錯誤信息。
-
使用 customErrors 配置元素控制誰(shuí)可以查看服務(wù)器發(fā)出的異常。
-
對于容易發(fā)生錯誤的情況(如數據庫訪(fǎng)問(wèn))創(chuàng )建自定義錯誤處理方式。
保證敏感信息的安全
“敏感信息”是需要保密的任意信息。密碼或加密密鑰即是典型的敏感信息。如果惡意用戶(hù)可以獲得敏感信息,則該信息保護的數據將受到威脅。請遵循這些指導:
-
如果您的應用程序在瀏覽器和服務(wù)器之間傳輸敏感信息,請考慮使用安全套接字層 (SSL)。有關(guān)如何使用 SSL 加密網(wǎng)站的詳細信息,請參見(jiàn) Microsoft 知識庫中的文章 Q307267,“How to: Secure XML Web Services with Secure Sockets Layer in Windows 2000”(如何:在 Windows 2000 中使用安全套接字層確保 XML Web 服務(wù)的安全)。
-
使用受保護的配置來(lái)確保配置文件(如 Web.config 或 Machine.config 文件)中敏感信息的安全。有關(guān)更多信息,請參見(jiàn) 使用受保護的配置加密配置信息。
-
如果您必須存儲敏感信息,即使是以您認為人們將無(wú)法看到它的形式(如在服務(wù)器代碼中)進(jìn)行保存,也不要將它保存在網(wǎng)頁(yè)中。
-
使用 System.Security.Cryptography 命名空間中提供的強加密算法。
安全地使用 Cookie
為了讓用戶(hù)特定的信息保持可用,Cookie 是一種容易而有用的方法。但是,由于 Cookie 會(huì )被發(fā)送到瀏覽器所在的計算機,因此它們容易被假冒或用于其他惡意用途。請遵循這些指導:
防止拒絕服務(wù)威脅
惡意用戶(hù)危害您的應用程序的一種間接方式是使其不可用。惡意用戶(hù)可以使應用程序太忙而無(wú)法為其他用戶(hù)提供服務(wù),或者僅僅使應用程序出現故障。請遵循這些指導:
-
關(guān)閉或釋放您使用的任何資源。例如,在使用完畢后,始終關(guān)閉數據連接和數據讀取器,而且始終關(guān)閉文件。
-
使用錯誤處理機制(例如,try/catch 塊)。包含 finally 塊,以便萬(wàn)一失敗就可以在其中釋放資源。
-
將 IIS 配置為使用調節,這樣可以防止應用程序消耗過(guò)多的 CPU。
-
在使用或存儲用戶(hù)輸入之前,測試它的大小限制。
-
對數據庫查詢(xún)設置大小保護措施,以防止大型查詢(xún)耗盡系統資源。
-
如果文件上載是您的應用程序的一部分,則對它們的大小加以限制。您可以使用類(lèi)似下面代碼示例的語(yǔ)法在 Web.config 文件中設置限制(其中 maxRequestLength 值以千字節為單位):
<configuration> <system.web> <httpRuntime maxRequestLength="4096" /> </system.web> </configuration>


