共用方式為


HOW TO:利用將 HTML 編碼套用至字串的方法,防止會在 Web 應用程式中發生的指令碼攻擊

更新:2007 年 11 月

大多數的指令碼擅用發生在使用者可將可執行程式碼 (或指令碼) 放入應用程式中時。根據預設,ASP.NET 提供要求驗證,當張貼的表單上包含任何的 HTML 時,會引發錯誤。

使用下列方法可以防範指令碼擅用:

  • 對表單變數、查詢字串變數和 cookie 值執行參數驗證。這個驗證應包括兩種類型的驗證:是否可將變數轉換為預期型別 (例如,轉換為整數、轉換為日期時間等等) 的驗證,以及預期範圍或格式的驗證。例如,應使用 Int32.TryParse 方法檢查應該是整數的表單張貼變數,以驗證該變數是否確實是整數。此外,還應檢查結果整數,以驗證該值是否在預期的值範圍內。

  • 將值寫出至回應時,會將 HTML 編碼套用至字串輸出。這可確保任何使用者提供的字串輸入在瀏覽器中都會呈現為靜態 (Static) 文字,而不是可執行指令碼或解譯的 HTML 項目。

HTML 編碼使用 HTML 保留字元轉換 HTML 項目,如此就會顯示而不是執行 HTML 項目。

若要將 HTML 編碼套用至字串

  • 在顯示字串之前,先呼叫 HtmlEncode 方法。HTML 項目會轉換成字串表示,瀏覽器將顯示這些項目,而不會將其視為 HTML 編譯。

    以下範例說明 HTML 編碼。第一個例子中,使用者輸入在顯示前已經編碼。第二個例子中,來自資料庫的資料在顯示前已經編碼。

    注意事項:

    只有在加入 @ Page 屬性 (Attribute) ValidateRequest="false" 停用網頁中的要求驗證時,這個範例才能作用。建議您不要停用實際執行應用程式中的要求驗證,所以請在檢視這個範例之後確定已重新啟用要求驗證。

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e _
        As System.EventArgs) Handles Button1.Click
            Label1.Text = Server.HtmlEncode(TextBox1.Text)
            Label2.Text = _
                Server.HtmlEncode(dsCustomers.Customers(0).CompanyName)
    End Sub
    
    private void Button1_Click(object sender, System.EventArgs e)
    {
        Label1.Text = Server.HtmlEncode(TextBox1.Text);
        Label2.Text = 
            Server.HtmlEncode(dsCustomers1.Customers[0].CompanyName);
    }
    

請參閱

概念

指令碼攻擊概觀

Web 應用程式安全性威脅概觀

Web 應用程式的基本安全性實行方式