本文介绍 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 代码:
运行此代码将生成一个简单的页面,使你可以在文本框中输入某些文本,单击该按钮,并在标签控件中显示文本:
但是,JavaScript(例如
<script>alert("hello!")</script>
,要输入并提交),我们将获得异常:
错误消息指出“检测到了潜在的危险 Request.Form 值”,并在说明中提供了更详细的说明,具体说明以及如何更改行为。 例如:
请求验证检测到潜在的危险客户端输入值,并且请求的处理已中止。 此值可能表示尝试破坏应用程序的安全性,例如跨站点脚本攻击。 可以通过在 Page 指令或配置部分中设置
validateRequest=false
来禁用请求验证。 但是,强烈建议应用程序在此示例中显式检查所有输入。
在页面上禁用请求验证
若要在页面上禁用请求验证,必须将 Page 指令的属性设置为
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> ,结果将为:
若要防止这种情况发生,请求验证已关闭,我们需要对内容进行 HTML 编码。
如何对内容进行 HTML 编码
如果禁用了请求验证,最好是将存储为将来使用而存储的 HTML 编码内容。 HTML 编码将自动将任何“<”或“”> (替换为其他几个符号,) 相应的 HTML 编码表示形式。 例如,“<”替换为“<”,“>”替换为“>”。 浏览器使用这些特殊代码在浏览器中显示“”<或“>”。
可以使用 API 在服务器上 Server.HtmlEncode(string) 轻松对内容进行 HTML 编码。 还可以轻松对内容进行 HTML 解码,即使用 Server.HtmlDecode(string) 该方法还原为标准 HTML。