即使您對應用程式安全性的體驗和瞭解非常有限,也應採取一些基本措施來保護您的 Web 應用程式。本主題的以下各部分提供了適用於所有 Web 應用程式的最低安全性準則。有關編寫安全的程式碼和確保應用程式安全的最佳做法的更多詳細資料,請參見由 Michael Howard 和 David LeBlanc 編寫的書籍《編寫安全的程式碼》以及由 “Microsoft Patterns and Practices”(Microsoft 模式和實踐)提供的指導。
常規 Web 應用程式安全性建議
使用最少提高權限執行應用程式
瞭解您的使用者
防止惡意使用者的輸入
安全地訪問資料庫
建立安全的錯誤訊息
保證敏感資訊的安全
安全地使用 Cookie
防止拒絕服務威脅
常規 Web 應用程式安全性建議
如果惡意使用者可以使用簡單方法進入您的電腦,即使是最精心設計的應用程式安全性也會失敗。常規 Web 應用程式安全性建議包括以下內容:
經常備份資料,並將備份存放在安全的場所。
將您的 Web 服務器放置在安全的場所,使未經授權的使用者無法訪問它、關閉它、帶走它,等等。
使用 Windows NTFS 檔案系統,不使用 FAT32。NTFS 的安全性比 FAT32 高得多。有關詳細資料,請參見 Windows 協助文檔。
使用不易破解的密碼,保護 Web 服務器和同一網路上的所有電腦的安全。
遵循用於確保 Internet 資訊服務 (IIS) 安全的最佳做法。有關詳細資料,請參見 “Windows Server TechCenter for IIS”(用於 IIS 的 Windows Server TechCenter)。
關閉任何不使用的連接埠並關閉不使用的服務。
運行監視網站通訊量的病毒檢查程式。
使用防火牆。有關建議,請參見 Microsoft 安全網站上的 “Microsoft Firewall Guidelines”(Microsoft 防火牆準則)。
瞭解和安裝來自 Microsoft 和其他供應商的最新安全更新。
使用 Windows 事件記錄記錄,並且經常檢查這些日誌,以尋找可疑活動。這樣的活動包括:反覆嘗試登入您的系統,以及向您的 Web 服務器發出數量巨大的請求。
使用最少提高權限執行應用程式
當您的應用程式運行時,它運行在一個具有本機電腦(還可能是遠端電腦)的特定特權的上下文中。有關配置應用程式識別碼的資訊,請參見 配置 ASP.NET 進程標識。
若要以最少提高權限執行,請遵循以下準則:
不要以系統使用者(管理員)身份運行應用程式。
在具有最少實用特權的使用者上下文中運行應用程式。
設定應用程式所需的所有資源上的許可權(ACL 或存取控制清單)。使用最嚴格的設定。例如,如果在您的應用程式中是可行的,則將檔案設定為唯讀。有關 ASP.NET 應用程式識別碼所需的最少 ACL 許可權的列表,請參見 ASP.NET 必需的存取控制清單 (ACL)。
將您的 Web 應用程式的檔案儲存在應用程式根目錄下的一個檔案夾中。不要讓使用者指定在應用程式中進行檔案訪問的路徑。這樣有助於防止使用者訪問伺服器的根目錄。
瞭解您的使用者
在許多應用程式中,使用者有可能不必提供憑據即可訪問網站。如果是這樣,則您的應用程式通過在預定義使用者的上下文中運行即可訪問資源。預設情況下,此上下文是 Web 服務器上的本地 ASPNET 使用者(Windows 2000 或 Windows XP)或 NETWORK SERVICE 使用者 (Windows Server 2003)。
若要僅允許已授權使用者進行訪問,請遵循以下準則:
防止惡意使用者的輸入
通常,決不假定從使用者獲得的輸入是安全的。對惡意使用者來說,從用戶端向您的應用程式發送潛在危險的資訊是很容易的。若要協助防止惡意輸入,請遵循以下準則:
在表單中,篩選使用者輸入以尋找 HTML 標籤,其中可能包含指令碼。有關詳細資料,請參見 如何:通過對字串應用 HTML 編碼在 Web 應用程式中防止指令碼侵入。
決不回顯(顯示)未經篩選的使用者輸入。在顯示不受信任的資訊之前,對 HTML 進行編碼以將潛在有害的指令碼轉換為顯示字串。
類似地,決不將未經篩選的使用者輸入儲存在資料庫中。
如果要接受來自使用者的一些 HTML,則手動篩選它。在您的篩選器中,顯式定義將要接受的內容。不要建立一個試圖篩選出惡意輸入的篩選器;因為預料到所有可能的惡意輸入是非常困難的。
不要假定您從標題(通常通過 Request 對象)獲得的資訊是安全的。對查詢字串、Cookie 等採取安全措施。注意,瀏覽器向伺服器報告的資訊(使用者代理程式資訊)可以被假冒(如果此資訊在您的應用程式中相當重要)。
如有可能,不要將敏感資訊(如隱藏欄位或 Cookie)儲存在可從瀏覽器訪問的位置。例如,不要將密碼儲存在 Cookie 中。
注意 |
檢視狀態是以編碼格式儲存在隱藏欄位中的。預設情況下,它包含訊息身分識別驗證代碼 (MAC),這樣頁可以確定檢視狀態是否已被篡改。 |
安全地訪問資料庫
資料庫通常具有它們自己的安全性。Web 應用程式安全性的一個重要方面是設計一種應用程式安全地訪問資料庫的方式。請遵循這些指導:
使用資料庫的內在安全性來限制可以訪問資料庫資源的人員。確切的策略取決於您的資料庫和應用程式:
不要通過串聯涉及使用者輸入的字串建立 SQL 陳述式。相反,建立參數化查詢並使用使用者輸入設定參數值。
如果您必須將使用者名稱和密碼儲存在某個位置以用作資料庫登入憑據,請安全地儲存它們。如果可行,請對它們進行加密或計算雜湊值。有關詳細資料,請參見 加密和解密資料。
有關安全地訪問資料的更多資訊,請參見 保證 ADO.NET 應用程式的安全。
建立安全的錯誤訊息
如果您不小心,惡意使用者就可以從應用程式顯示的錯誤訊息推斷出有關您的應用程式的重要訊息。請遵循這些指導:
不要編寫會回顯可能對惡意使用者有用的資訊(例如使用者名稱)的錯誤訊息。
將應用程式配置為不向使用者顯示詳細錯誤。如果為進行調試而要顯示詳細錯誤訊息,請先檢查該使用者是否為 Web 服務器的本機使用者。有關詳細資料,請參見 如何:顯示安全錯誤資訊。
使用 customErrors 配置元素控制誰可以查看伺服器發出的異常。
對於容易發生錯誤的情況(如資料庫訪問)建立自訂錯誤處理方式。
保證敏感資訊的安全
“敏感資訊”是需要保密的任意資訊。密碼或加密金鑰即是典型的敏感資訊。如果惡意使用者可以獲得敏感資訊,則該資訊保護的資料將受到威脅。請遵循這些指導:
如果您的應用程式在瀏覽器和伺服器之間傳輸敏感資訊,請考慮使用安全通訊端層 (SSL)。有關如何使用 SSL 加密網站的詳細資料,請參見 Microsoft 知識庫中的文章 Q307267,“How to: Secure XML Web Services with Secure Sockets Layer in Windows 2000”(如何:在 Windows 2000 中使用安全通訊端層確保 XML Web 服務的安全)。
使用受保護的配置來確保設定檔(如 Web.config 或 Machine.config 檔案)中敏感資訊的安全。有關更多資訊,請參見 使用受保護的配置加密配置資訊。
如果您必須儲存敏感資訊,即使是以您認為人們將無法看到它的形式(如在伺服器代碼中)進行儲存,也不要將它儲存在網頁中。
使用 System.Security.Cryptography 命名空間中提供的強密碼編譯演算法。
安全地使用 Cookie
為了讓使用者特定的資訊保持可用,Cookie 是一種容易而有用的方法。但是,由於 Cookie 會被發送到瀏覽器所在的電腦,因此它們容易被假冒或用於其他惡意用途。請遵循這些指導:
不要將任何關鍵資訊儲存在 Cookie 中。例如,不要將使用者的密碼儲存在 Cookie 中,即使是暫時儲存也不要這樣做。作為一項原則,不要在 Cookie 中儲存任何敏感資訊。而是在 Cookie 中儲存對資訊在伺服器上的位置的引用。
將 Cookie 的到期日期設定為可以設定的最短時間。儘可能避免使用永久的 Cookie。
考慮對 Cookie 中的資訊加密。
考慮將 Cookie 的 Secure 和 HttpOnly 屬性設定為 true。
防止拒絕服務威脅
惡意使用者危害您的應用程式的一種間接方式是使其不可用。惡意使用者可以使應用程式太忙而無法為其他使用者提供服務,或者僅僅使應用程式出現故障。請遵循這些指導:
關閉或釋放您使用的任何資源。例如,在使用完畢後,始終關閉資料連線和資料讀取器,而且始終關閉檔案。
使用錯誤處理機制(例如,try/catch 塊)。包含 finally 塊,以便萬一失敗就可以在其中釋放資源。
將 IIS 配置為使用調節,這樣可以防止應用程式消耗過多的 CPU。
在使用或儲存使用者輸入之前,測試它的大小限制。
對資料庫查詢設定大小保護措施,以防止大型查詢耗盡系統資源。
如果檔案上傳是您的應用程式的一部分,則對它們的大小加以限制。您可以使用類似下面程式碼範例的文法在 Web.config 檔案中設定限制(其中 maxRequestLength 值以KB為單位):
複製代碼
<configuration> <system.web> <httpRuntime maxRequestLength="4096" /> </system.web></configuration>
還可以使用 RequestLengthDiskThreshold 屬性來減少大型上傳和表單發布所需的記憶體開銷。