要求驗證 - 防止指令碼攻擊
本文件描述 ASP.NET 的要求驗證功能,根據預設,應用程式無法處理未編碼的 HTML 內容提交至伺服器。 當應用程式設計為安全地處理 HTML 資料時,可以停用此要求驗證功能。
適用於 ASP.NET 1.1 和 ASP.NET 2.0。
要求驗證是 a feature of ASP.NET 在 1.1 版之後推出的功能,可防止伺服器接受包含未編碼 HTML 的內容。 此功能旨在協助防止一些指令碼插入式攻擊,用戶端指令碼程式碼或 HTML 可能會因此不知不覺地送出至某個伺服器、儲存下來,然後提供給其他使用者。 仍強烈建議您驗證所有的輸入資料和 HTML,並在適當時進行編碼。
例如,您可以建立一個網頁來要求使用者的電子郵件地址,然後將該電子郵件地址儲存在資料庫中。 如果使用者輸入 <SCRIPT>alert(「從指令碼發出 hello」)</SCRIPT>,而不是正確的電子郵件地址,則在該資料存在情況下,當內容未正確編碼,此指令碼就可以執行。 ASP.NET 的要求驗證功能可防止這種情況發生。
為什麼這項功能很有用
許多網站都不自知本身會受到簡易指令碼插入式攻擊。 無論這些攻擊的目的是藉由顯示 HTML 來讓駭客趁隙而入,或是可能執行用戶端指令碼來將使用者重新導向至駭客的網站,指令碼插入式攻擊都是 Web 開發人員必須處理的問題。
指令碼插入式攻擊是所有 Web 開發人員所關心的問題,無論是使用 ASP.NET、ASP 或其他 Web 開發技術。
ASP.NET 要求驗證功能會主動防止這些攻擊,除非開發人員決定允許該內容,否則伺服器不會處理未編碼的 HTML 內容。
可預期的結果:錯誤頁面
下列螢幕擷取畫面顯示一些範例 ASP.NET 程式碼:
執行此程式碼會產生簡單的頁面,供您在文字方塊中輸入文字、按下按鈕,並在標籤控制項上顯示文字:
不過,如果是 JavaScript 程式碼,例如 <script>alert("hello!")</script>
要輸入並提交,則可能會收到例外狀況:
錯誤訊息指出 (偵測到「可能危險的 Request.Form 值」),並在描述中提供更多詳情,以明確說明發生事件,以及如何變更行為。 例如:
要求驗證偵測到潛在的危險用戶端輸入值,且要求已中止處理。 此值可能表示嘗試危害應用程式的安全性,例如跨網站指令碼攻擊。 您可以選擇停用要求驗證,方法是validateRequest=false
前往 Page 指示詞或組態區段中進行設定。 不過,遇到這種情況,強烈建議您的應用程式明確檢查所有輸入。
停用頁面上的要求驗證
若要停用頁面上的要求驗證,您必須將 validateRequest
Page 指示詞的屬性設定為 false
:
<%@ Page validateRequest="false" %>
警告
停用要求驗證時,內容可以提交至頁面;頁面開發人員必須負責確保內容已正確編碼或處理。
停用應用程式的要求驗證
若要停用應用程式的要求驗證,您必須修改或建立應用程式的 Web.config 檔案,並將 <pages />
區段的 validateRequest 屬性設定為 false
:
<configuration>
<system.web>
<pages validateRequest="false" />
</system.web>
</configuration>
如果您想要停用伺服器上所有應用程式的要求驗證,您可以對 Machine.config 檔案進行這項修改。
警告
停用要求驗證時,內容可以提交至應用程式;應用程式開發人員必須負責確保內容已正確編碼或處理。
下列程式碼已修改為關閉要求驗證:
現在,如果下列 JavaScript 輸入至文字方塊 <script>alert("hello!")</script>
,其將產生下列結果:
為了防止這種情況發生,且此時要求驗證已關閉,這時我們需要對內容執行 HTML 編碼。
操作說明對內容執行 HTML 編碼
如果您已停用要求驗證,最好是對內容執行 HTML 編碼來處理將儲存以供日後使用的內容。 HTML 編碼會自動以對應的 HTML 編碼表示取代任何「<」或「>」(以及其他幾個符號)。 例如,「<」會由「<」取代,而「>」會由「>」取代。 瀏覽器會在瀏覽器中以這些特殊代碼顯示「<」或「>」。
內容可透過 Server.HtmlEncode(string)
API 在伺服器上進行 HTML 編碼。 內容也可以輕鬆地執行 HTML 解碼,也就是使用 Server.HtmlDecode(string)
方法還原回標準 HTML。
產生的結果: