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); }