每当用户在我的web应用程序中的页面中发布包含<或>的内容时,我都会引发此异常。

我不想因为有人在文本框中输入了字符而引发异常或使整个web应用程序崩溃,但我正在寻找一种优雅的方式来处理这一问题。

捕获异常并显示

出现错误,请返回并重新键入整个表单,但这次请不要使用<

我觉得不够专业。

禁用后验证(validateRequest=“false”)肯定可以避免此错误,但这会使页面容易受到许多攻击。

理想情况下:当发生包含HTML限制字符的回发时,表单集合中的回发值将自动进行HTML编码。因此,我的文本框的.Text属性将是&lt;html&gt;

有没有办法让我从处理者那里做到这一点?


当前回答

即使在将<httpRuntime requestValidationMode=“2.0”>添加到web.config之后,我仍然在使用WIF进行身份验证的应用程序中收到错误。为我解决的是在<system.web>元素中添加<sessionState mode=“InProc”cookieless=“UseUri”/>。

其他回答

请记住,某些.NET控件将自动对输出进行HTML编码。例如,在TextBox控件上设置.Text属性将自动对其进行编码。这特别意味着将<转换为&lt;,>进入&gt;和&进入&amp;。所以要小心这样做。。。

myTextBox.Text = Server.HtmlEncode(myStringFromDatabase); // Pseudo code

然而,HyperLink、Literal和Label的.Text属性不会对内容进行HTML编码,因此包装Server.HtmlEncode();如果要防止<script>window.location=“http://www.google.com“;</script>被输出到页面并随后执行。

做一点实验,看看哪些被编码,哪些没有编码。

您可以使用以下内容:

var nvc = Request.Unvalidated().Form;

稍后,nvc[“yourKey”]应该会起作用。

我想你可以在一个模块中完成;但这留下了一些问题;如果您想将输入保存到数据库中怎么办?突然间,由于您正在将编码数据保存到数据库中,您最终会信任来自数据库的输入,这可能是一个坏主意。理想情况下,您将原始未编码数据存储在数据库中,并每次进行编码。

在每页级别禁用保护,然后每次编码是更好的选择。

与其使用Server.HtmlEncode,不如看看Microsoft ACE团队提供的更新、更完整的反XSS库。

如果您使用的是framework 4.0,则web.config中的条目(<pages validateRequest=“false”/>)

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

如果您使用的是框架4.5,则web.config中的条目(requestValidationMode=“2.0”)

<system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" requestValidationMode="2.0"/>
</system.web>

如果你只想要一个页面,那么在aspx文件中,你应该把第一行放在下面:

<%@ Page EnableEventValidation="false" %>

如果您已经有类似于<%@页面的内容,那么只需添加rest=>EnableEventValidation=“false”%>

我建议不要这样做。

原因

默认情况下,ASP.NET验证所有输入控件中可能导致跨站点脚本(XSS)和SQL注入的潜在不安全内容。因此,它通过抛出上述异常来禁止此类内容。默认情况下,建议允许在每次回发时进行此检查。

解决方案

在许多情况下,您需要通过富文本框或富文本编辑器将HTML内容提交到页面。在这种情况下,可以通过将@Page指令中的ValidateRequest标记设置为false来避免此异常。

<%@ Page Language="C#" AutoEventWireup="true" ValidateRequest = "false" %>

这将禁用已将ValidateRequest标志设置为false的页面的请求验证。如果要禁用此功能,请检查整个web应用程序;您需要在web.config<system.web>部分中将其设置为false

<pages validateRequest ="false" />

对于.NET 4.0或更高版本的框架,您还需要在<system.web>部分添加以下行以使上述工作正常。

<httpRuntime requestValidationMode = "2.0" />

就是这样。我希望这能帮助你解决上述问题。

引用者:ASP.Net错误:从客户端检测到潜在危险的Request.Form值