Share via


如何:通过对字符串应用 HTML 编码在 Web 应用程序中防止脚本侵入

更新:2007 年 11 月

大多数脚本利用发生在用户可以将可执行代码(或脚本)插入您的应用程序时。默认情况下,ASP.NET 提供请求验证。只要窗体发送包含任何 HTML,该验证都会引发错误。

您可以使用下列方法防止脚本利用:

  • 对窗体变量、查询字符串变量和 Cookie 值执行参数验证。该验证应包括两种类型的验证:可以将变量转换为所需类型(如转换为整数、日期时间等)的验证,以及所需范围或格式的验证。例如,应该使用 Int32.TryParse 方法来检查应为整数的窗体发送变量,以验证该变量是否确实为整数。而且,还应该检查得到的整数,以验证该值是否在所需值范围之内。

  • 将值写回响应时,向字符串输出应用 HTML 编码。这有助于确保用户提供的所有字符串输入将以静态文本形式呈现在浏览器中,而不是呈现为可执行的脚本代码或已解释的 HTML 元素。

HTML 编码使用 HTML 保留字符转换 HTML 元素,以便显示它们而不是执行它们。

向字符串应用 HTML 编码

  • 显示字符串之前,调用 HtmlEncode 方法。HTML 元素会转换为浏览器将显示(而不解释为 HTML)的字符串表示形式。

    下面的示例说明 HTML 编码。在第一个实例中,在显示用户输入之前对其进行编码。在第二个实例中,在显示数据库中的数据之前对其进行编码。

    a2a4yykt.alert_note(zh-cn,VS.90).gif说明:

    只有通过添加 @ Page 属性 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 应用程序的基本安全实施策略