大多数脚本利用发生在用户可以将可执行代码(脚本)插入您的应用程序时。默认情况下,ASP.NET 提供请求验证。不管窗体发送包含什么样的 HTML,该验证都会引发错误。
您可以使用下列方法防止脚本利用:
本主题中的过程说明如何执行这些任务。
应用 HTML 编码HTML 编码使用 HTML 保留字符转换 HTML 元素,以便显示它们而不是执行它们。
应用 HTML 编码
以下示例说明 HTML 编码。在一个实例中,在显示用户输入之前对其进行编码。在第二个实例中,在显示数据库中的数据之前对其进行编码。
注意 只有通过向 asp">@ Page 指令中添加 alidateRequest="false" 来在页中禁用请求验证时,此示例才将起作用。决不禁用请求验证而不添加您自己的检查或筛选器。' Visual Basic 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 // C# private void Button1_Click(object sender, System.EventArgs e) { Label1.Text = Server.HtmlEncode(TextBox1.Text); Label2.Text = Server.HtmlEncode(dsCustomers1.Customers[0].CompanyName); }默认情况下,Web 窗体页检测发送到服务器的信息中的任何 HTML 元素和保留字符。这样,将防止用户试图将脚本嵌入您的应用程序。当页检测到 HTML 时,它会引发一个错误。您可以使用 Page_Error 或 Application_Error 处理程序捕捉此错误。有关详细信息,请参见asp">显示安全的错误信息。
但是,如果您的应用程序需要接受某些 HTML 元素,可关闭请求验证,并创建一个只允许使用要接受的 HTML 元素的筛选器。
注意 不要创建试图只筛选出不可接受元素的筛选器,因为预料每个可能的错误输入十分困难。相反,如果您创建筛选器,则创建一个定义可接受输入的筛选器。筛选 HTML 元素
以下示例说明一个简单的筛选器,它接受加粗元素和带下划线的元素(<b>、</b>、<u>、</u>)。在显示所有其他用户输入之前都对其进行编码。
安全说明 许多 HTML 标记都允许在其属性中使用脚本。例如,标记 <img src="javascript:alert('hi')"> 是合法的。如果您希望接受比简单的格式设置标记更复杂的 HTML 标记,则必须确保恶意用户无法假借允许的 HTML 标记将脚本传递到您的应用程序。' Visual Basic Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim userinput As String = TextBox1.Text userinput = Server.HtmlEncode(userinput) ' Accepts <b>, </b>, <u>, </u>, case-insensitive userinput = userinput.Replace("<b>", "<b>") userinput = userinput.Replace("</b>", "</b>") userinput = userinput.Replace("<B>", "<B>") userinput = userinput.Replace("</B>", "</B>") userinput = userinput.Replace("<u>", "<u>") userinput = userinput.Replace("</u>", "</u>") userinput = userinput.Replace("<U>", "<U>") userinput = userinput.Replace("</U>", "</U>") Label1.Text = userinput End Sub // C# private void Button1_Click(object sender, System.EventArgs e) { String userinput = TextBox1.Text; userinput = Server.HtmlEncode(userinput); // Accepts <b>, </b>, <u>, </u>, case-insensitive userinput = userinput.Replace("<b>", "<b>"); userinput = userinput.Replace("</b>", "</b>"); userinput = userinput.Replace("<B>", "<B>"); userinput = userinput.Replace("</B>", "</B>"); userinput = userinput.Replace("<u>", "<u>"); userinput = userinput.Replace("</u>", "</u>"); userinput = userinput.Replace("<U>", "<U>"); userinput = userinput.Replace("</U>", "</U>"); Label1.Text = userinput; }