Web 應用程式的基本安全性實行方式
更新:2007 年 11 月
建立安全 Web 應用程式的主題非常廣泛。需要研讀以了解安全性弱點。您自己也需要熟悉 Windows、.NET Framework 和 ASP.NET 的安全性設施。最後,了解如何將這些安全性功能用來抵抗威脅是非常重要的。
即使您對於安全性沒有經驗,有幾個基本方法應該可供您保護 Web 應用程式。下列清單會提供可套用至所有 Web 應用程式,而且您應該遵循的最低限度安全性方針:
一般 Web 應用程式的安全性建議
以最小權限執行應用程式
了解您的使用者
防範惡意使用者輸入
安全存取資料庫
建立安全的錯誤訊息
安全存放秘密
安全使用 Cookie
防範拒絕服務的威脅
注意事項: 如需有助於您設計、開發、設定和部署更安全之 ASP.NET Web 應用程式的廣泛且詳細的安全性指引,請參閱 Microsoft 典範與實例網站所提供的安全性模組。
一般 Web 應用程式的安全性建議
如果惡意使用者可以使用簡單的方法進入您的電腦,即使是最精心設計的應用程式安全性也可能會失敗。請遵循這些方針:
勤加備份,並將備份存放在安全的實體中。
將 Web 伺服器電腦放在安全的處所,如此未經授權的使用者就無法擅自進入、關閉或取走電腦。
使用 Windows NTFS 檔案系統,而不是 FAT32。NTFS 能提供較 FAT32 更完善的安全性。如需詳細資訊,請參閱 Windows 文件。
使用更牢靠的密碼,保護 Web 伺服器電腦和其他位於同一個網路上所有電腦的安全。
保護 IIS 的安全。如需詳細資訊,請參閱 Microsoft TechNet Security Center 網站。
關閉未使用的連接埠和服務。
執行可監視傳入和傳出流量的病毒檢查程式。
建立並實施禁止使用者將密碼寫在容易找到的位置的原則。
使用防火牆。如需建議事項,請參閱 Microsoft 安全性網站上的 Microsoft Firewall Guidelines。
安裝 Microsoft 和其他廠商的最新版安全性修補檔案。例如,Microsoft TechNet Security Center 網站提供了所有 Microsoft 產品最新安全性佈告欄的清單。其他廠商也有類似的網站。
使用 Windows 事件記錄,並經常檢查記錄檔,找出可疑的活動。包括重複性登入系統的嘗試,以及要求您 Web 伺服器的驚人數字。
以最小權限執行應用程式
當應用程式執行時,它在本機電腦上以及可能在遠端電腦上具有特定權限的內容上執行。如需設定應用程式識別的詳細資訊,請參閱設定 ASP.NET 處理序識別。若要以最小的權限執行,請遵循下列方針:
請勿使用系統使用者 (系統管理員) 的識別執行應用程式。
以最小實際權限在使用者內容中執行應用程式。
設定應用程式所需之所有資源的使用權限 (存取控制清單或 ACL)。使用最小使用權限的設定。例如,如果在您的應用程式中可行的話,將檔案設為唯讀。如需 ASP.NET 應用程式之識別所需的必要最小 ACL 使用權限清單,請參閱 ASP.NET 所需的存取控制清單 (ACL)。
將這些 Web 應用程式的檔案放在應用程式根目錄下的資料夾中。請勿允許使用者指定路徑的選項,供其在應用程式中作任何檔案存取。這樣有助於避免使用者取得對伺服器根目錄的存取。
了解您的使用者
在許多應用程式中,使用者會匿名存取網站 (不需提供認證)。如果是這樣,應用程式存取資源是在預先定義使用者的內容中執行的。根據預設,這個內容是本機 ASPNET 使用者 (在 Windows 2000 或 Windows XP 上) 或在 Web 伺服器電腦上的 NETWORK SERVICE 使用者 (在 Windows Server 2003 上)。若要限制對已驗證使用者的存取,請遵循以下方針:
如果應用程式為內部網路應用程式,將其設定為使用 Windows 整合安全性。這樣一來,使用者的登入認證就能用來存取資源。如需詳細資訊,請參閱 ASP.NET 模擬。
如果必須向使用者收集認證,使用其中一項 ASP.NET 驗證策略。如需範例,請參閱使用成員資格管理使用者。
防範惡意使用者輸入
通則就是,絕對不要假設從使用者取得的輸入是安全的。惡意使用者輕易就能從用戶端傳送具有潛在危險性的資訊到您的應用程式。若要防範惡意的輸入資料,請遵循以下方針:
在 ASP.NET Web 網頁中,篩選使用者輸入以檢查 HTML 標記,其中可能含有指令碼。如需詳細資訊,請參閱 HOW TO:利用將 HTML 編碼套用至字串的方法,防止會在 Web 應用程式中發生的指令碼攻擊。
絕對不要 echo (顯示) 未篩選的使用者輸入。在顯示未受信任的資訊前,將 HTML 編碼,使具有潛在傷害性的指令碼轉換成顯示字串。
請勿將未篩選的使用者輸入存放在資料庫中。
如果收到來自使用者的 HTML,用手動方式篩選。在篩選條件中,明確定義您可以接受的內容。請勿建立試圖篩選出惡意使用者輸入的篩選條件,要考慮到所有可能的惡意輸入是非常困難的。
請勿假設您從 HTTP 要求標頭 (在 HttpRequest 物件中) 取得的資訊是安全的。對查詢字串、Cookie 等採取防護措施。留意瀏覽器回報給伺服器的資訊 (使用者代理資訊) 有可能是假造的,尤其該資訊在應用程式中很重要時。
可能的話,不要將機密資訊儲存在瀏覽器可以存取的地方,如隱藏欄位或 Cookie。例如,不要將密碼儲存在 Cookie 中。
注意事項: 檢視狀態是以編碼格式儲存在隱藏欄位中。根據預設,它含有訊息驗證程式碼 (MAC),如此網頁可判斷檢視狀態是否已遭竄改。如果敏感性資訊是存放在檢視狀態中,則將網頁的 ViewStateEncryptionMode 屬性 (Property) 設為 true 以進行加密。
安全存取資料庫
資料庫通常具有自己的安全性。安全 Web 應用程式的重要觀點,就是設計應用程式以安全方式存取資料庫。請遵循這些方針:
使用資料庫固有的安全性,限制能存取資料庫資源的使用者。實際的策略取決於您的資料庫和應用程式:
如果您應用程式中可行的話,使用整合式安全性,如此只有 Windows 驗證的使用者可以存取資料庫。整合式安全性會比將明確認證傳送至資料庫更加安全。
如果應用程式涉及匿名存取,您可建立具有非常小使用權限的單一使用者,再以這個使用者的身分連接以便執行查詢。
請勿使用含有使用者輸入的串連字串建立 SQL 陳述式,而是要建立參數型查詢,並使用使用者輸入設定參數值。
如果您必須將使用者名稱和密碼存放在某處以做為資料庫登入認證使用,請將這些資訊存放在 Web.config 檔中並以受保護的組態保護此檔案。如需詳細資訊,請參閱使用受保護的組態加密組態資訊。
如需安全存取資料的詳細資訊,請參閱設定資料存取的安全性和保護 ADO.NET 應用程式的安全。
建立安全的錯誤訊息
如果您沒有很小心,惡意使用者可以從應用程式顯示的錯誤資訊,推算出應用程式的重要資訊。請遵循這些方針:
不要撰寫會 echo 可能對惡意使用者有用資訊的錯誤訊息,例如使用者名稱。
將應用程式設定為不對使用者顯示詳細的錯誤。如果要顯示詳細的錯誤訊息供偵錯使用,首先判斷該使用者是否為 Web 伺服器的本機使用者。如需詳細資訊,請參閱HOW TO:顯示安全錯誤訊息。
使用 customErrors 組態項目,控制可以從伺服器檢視例外狀況的人員。
對容易發生錯誤的情況建立自訂的錯誤處理,如資料庫存取。如需詳細資訊,請參閱 ASP.NET Web 網頁和應用程式中的錯誤處理。
保護敏感性資訊的安全
敏感性資訊是您需要保持私密的任何資訊。典型的敏感性資訊就是密碼或加密金鑰。如果惡意使用者可以取得敏感性資訊,則秘密所保護的資料也會隨之洩漏。請遵循這些方針:
如果應用程式在瀏覽器和伺服器間傳送機密資訊,可考慮使用 Secure Sockets Layer (SSL)。如需如何以 SSL 保護網站的詳細資訊,請參閱 Microsoft 知識庫文件 Q307267<HOW TO: Secure XML Web Services with Secure Socket Layer in Windows 2000>,網址為 https://support.microsoft.com。
使用受保護的組態保護組態檔中的敏感性資訊,例如 Web.config 或 Machine.config 檔案。如需詳細資訊,請參閱使用受保護的組態加密組態資訊。
如果必須儲存敏感性資訊,請勿將它保存在網頁中,即使是您認為他人無法看到的表單中 (例如伺服器程式碼中)。
使用 System.Security.Cryptography 命名空間中提供的增強式加密演算法。
安全使用 Cookie
Cookie 是用來保存可用之使用者特定資訊的好方法。然而,因為 Cookie 傳送到瀏覽器的電腦,容易受到欺騙或其他惡意用途之害。請遵循這些方針:
請勿將任何重要資訊儲存在 Cookie。例如,不要將使用者密碼儲存在 Cookie 中,即使只是暫時儲存而已。就常理而言,並不建議將任何資料放在 Cookie,如果發生假冒身分,就可能危害您的應用程式,所以,應該是在 Cookie 中保留對資訊所在之伺服器上的參考。
將 Cookie 的過期日設定為可設定的最短實際時間。盡可能避免永久保留 Cookie。
考慮將 Cookie 中的資訊加密。
防範拒絕服務的威脅
惡意使用者可用來危害應用程式安全的一種間接方式,就是使應用程式無法使用。惡意使用者可以使應用程式太忙碌而無法為其他使用者提供服務,或是直接損毀應用程式。請遵循這些方針:
使用錯誤處理 (例如,try-catch)。在錯誤發生時,納入您釋放資源所在的 finally 區塊。
將 IIS 設定為使用處理序節流,可避免應用程式耗盡大量的 CPU 時間量。
在使用和儲存前,測試使用者輸入的大小限制。
將大小防護措施放在資料庫查詢中。例如,當您在 ASP.NET Web 網頁中顯示查詢結果前,請確定沒有不合理的記錄數目。
如果檔案上載是您程式的一部分時,將大小限制放在檔案上載上。您可使用以下語法在 Web.config 檔中設定限制,其中 maxRequestLength 值是以 KB 為單位:
<configuration> <system.web> <httpRuntime maxRequestLength="4096" /> </system.web> </configuration>
您也可以使用 RequestLengthDiskThreshold 屬性,減少大量上載和張貼表單所造成的記憶體額外負荷。