要求驗證 - 防止指令碼攻擊

本文說明 ASP.NET 的要求驗證功能,根據預設,應用程式無法處理提交至伺服器的未編碼 HTML 內容。 當應用程式設計成安全地處理 HTML 資料時,可以停用此要求驗證功能。

適用於 ASP.NET 1.1 和 ASP.NET 2.0。

要求驗證 (1.1 版後的 ASP.NET 功能) 可防止伺服器接受包含未編碼 HTML 的內容。 這項功能設計用來協助防止某些指令碼資料隱碼攻擊,因此不知不覺地將用戶端指令碼或 HTML 提交至伺服器、加以儲存,而後呈現給其他使用者。 我們仍強烈建議您驗證所有輸入資料,而且適時進行 HTML 編碼。

例如,您可以建立一個網頁來要求使用者的電子郵件地址,然後將該電子郵件地址儲存在資料庫中。 如果使用者輸入 <SCRIPT>警示 (“hello from script”) </SCRIPT> ,而不是有效的電子郵件地址,當顯示該數據時,如果內容未正確編碼,則可以執行此腳本。 ASP.NET 的要求驗證功能可防止發生這種情況。

為什麼這項功能很有用

許多網站都不知道它們對簡單的腳本插入式攻擊開放。 無論這些攻擊的目的是要藉由顯示 HTML 來清除網站,或可能執行用戶端腳本將使用者重新導向至駭客的網站,腳本插入式攻擊都是 Web 開發人員必須與之競爭的問題。

腳本插入式攻擊是所有 Web 開發人員的顧慮,不論他們使用的是 ASP.NET、ASP 或其他 Web 開發技術。

除非開發人員決定允許該內容,否則 ASP.NET 要求驗證功能會主動防止這些攻擊,方法是不允許伺服器處理未編碼的 HTML 內容。

預期內容:錯誤頁面

以下螢幕快照顯示一些範例 ASP.NET 程式代碼:

顯示 ASP.NET 程式代碼範例的螢幕快照。

執行此程式代碼會產生簡單的頁面,可讓您在文字框中輸入文字、按鍵,並在標籤中顯示文字:

顯示執行此程式碼的螢幕快照,會產生簡單的頁面,讓您在文字框中輸入一些文字、按下按鈕,並在標籤中顯示文字。

不過,是 JavaScript,例如 <script>alert("hello!")</script> 要輸入並提交,我們會收到例外狀況:

如果輸入並提交 JavaScript,則會取得例外狀況。

錯誤訊息指出「偵測到潛在的危險 Request.Form 值」,並在描述中提供更詳細的詳細數據,以確切說明發生的內容,以及如何變更行為。 例如:

要求驗證偵測到潛在的危險用戶端輸入值,並中止處理要求。 此值可能表示嘗試危害應用程式的安全性,例如跨網站腳本攻擊。 您可以在 Page 指示詞或組態區段中設定 validateRequest=false 來停用要求驗證。 不過,強烈建議您的應用程式在此案例中明確檢查所有輸入。

停用頁面上的要求驗證

若要停用頁面上的要求驗證,您必須將 validateRequest Page 指示詞的 屬性設定為 false

<%@ Page validateRequest="false" %>

警告

停用要求驗證時,可以將內容提交至頁面;頁面開發人員必須負責確保內容已正確編碼或處理。

停用應用程式的要求驗證

若要停用應用程式的要求驗證,您必須修改或建立應用程式的 Web.config 檔案,並將 區段的 <pages /> validateRequest 屬性設定為 false

<configuration>
   <system.web>
      <pages validateRequest="false" />
   </system.web>
</configuration>

如果您想要停用伺服器上所有應用程式的要求驗證,您可以對 Machine.config 檔案進行這項修改。

警告

停用要求驗證時,可以將內容提交至您的應用程式;應用程式開發人員必須負責確保內容已正確編碼或處理。

下列程式代碼已修改為關閉要求驗證:

顯示下列程式代碼的螢幕快照已修改為關閉要求驗證。

現在,如果在文本框中 <script>alert("hello!")</script> 輸入下列 JavaScript,結果會是:

顯示 JavaScript 是否已輸入文字框中的螢幕快照:結果會是按鈕 “Click Me!” 和一個指出 “hello!”的對話框。

若要避免發生這種情況,要求驗證已關閉,我們需要 HTML 編碼內容。

如何 HTML 編碼內容

如果您已停用要求驗證,最好是將儲存以供日後使用的 HTML 編碼內容。 HTML 編碼會自動取代任何 '<' 或 '>' (與其他數個符號,) 與其對應的 HTML 編碼表示法。 例如,'<' 會由 '<' 取代,'>' 會取代為 '>'。 瀏覽器會使用這些特殊程序代碼,在瀏覽器中顯示 『<『 或 』>。

您可以使用 API 輕鬆地在伺服器上 Server.HtmlEncode(string) 編碼內容。 內容也可以輕易地進行 HTML 譯碼,也就是使用 Server.HtmlDecode(string) 方法還原回標準 HTML。

顯示內容可以使用 Server.HtmlEncode (字串) API 輕鬆地在伺服器上編碼內容的螢幕快照。內容也可以輕易地進行 HTML 譯碼,也就是使用 Server.HtmlDecode (字串) 方法還原回標準 HTML。

將導致:

此螢幕快照顯示按鈕 「Click Me!“ 和文字框中成功的 JavaScript 項目訊息。