请求验证 - 阻止脚本攻击

本文介绍 ASP.NET 的请求验证功能,默认情况下,应用程序无法处理提交到服务器的未编码 HTML 内容。 当应用程序设计为安全处理 HTML 数据时,可以禁用此请求验证功能。

适用于 ASP.NET 1.1 和 ASP.NET 2.0。

请求验证是 ASP.NET 版本 1.1 中的一项功能,可阻止服务器接受包含未编码 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 来禁用请求验证。 但是,强烈建议应用程序在这种情况下显式检查所有输入。

禁用页面上的请求验证

若要在页面上禁用请求验证,必须将 Page 指令的 属性设置为 validateRequestfalse

<%@ Page validateRequest="false" %>

注意

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

禁用应用程序的请求验证

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

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

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

注意

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

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

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

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

显示是否在文本框中输入了 JavaScript 的屏幕截图:结果为“单击我!”按钮和一个显示“hello!”的对话框。

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

如何对内容进行 HTML 编码

如果已禁用请求验证,则最好对将存储以供将来使用的内容进行 HTML 编码。 HTML 编码会自动将任何“”<或“”> (替换为其他几个符号,) 替换为相应的 HTML 编码表示形式。 例如,“”<由“<”替换,“”>替换为“>”。 浏览器使用这些特殊代码在浏览器中显示“”<或“>”。

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

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

结果:

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