通过


请求验证 - 防止脚本攻击

本文介绍 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属性设置为false

<%@ Page validateRequest="false" %>

注意

禁用请求验证后,可以将内容提交到页面;页面开发人员有责任确保内容正确编码或处理。

为应用程序禁用请求验证

若要禁用应用程序的请求验证,必须为应用程序修改或创建 Web.config 文件,并将节的 <pages /> validateRequest 属性设置为 false

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

如果要禁用服务器上所有应用程序的请求验证,可以对 Machine.config 文件进行此修改。

注意

禁用请求验证后,可以将内容提交到应用程序;应用程序开发人员有责任确保内容正确编码或处理。

修改以下代码以关闭请求验证:

显示以下代码的屏幕截图已修改为关闭请求验证。

现在,如果以下 JavaScript 输入到文本框中 <script>alert("hello!")</script> ,结果将为:

显示 JavaScript 是否已输入到文本框中的屏幕截图:结果为“单击我!”按钮,并显示“hello!”的对话框。

若要防止这种情况发生,请求验证已关闭,我们需要对内容进行 HTML 编码。

如何 HTML 编码内容

如果禁用了请求验证,为将来存储使用的内容进行 HTML 编码是一个好习惯。 HTML 编码将自动将任何“<”或“”>(与其他几个符号)替换为相应的 HTML 编码表示形式。 例如,“<”被“lt;”替换,“>”替换为“>”。 浏览器使用这些特殊代码在浏览器中显示“”<或“>”。

可以使用 API 在服务器上轻松对 Server.HtmlEncode(string) 内容进行 HTML 编码。 内容也可以轻松进行 HTML 解码,即使用 Server.HtmlDecode(string) 该方法还原为标准 HTML。

显示可以使用 Server.HtmlEncode(string) API 在服务器上轻松对内容进行 HTML 编码的屏幕截图。也可以使用 Server.HtmlDecode(string) 方法轻松对内容进行 HTML 解码,即还原为标准 HTML。

结果:

显示“单击我!”按钮和文本框中 JavaScript 成功输入消息的屏幕截图。