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

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

捕获异常并显示

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

我觉得不够专业。

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

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

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


当前回答

没有一个答案对我有效。然后我发现,如果我删除了以下代码,我可以让它发挥作用:

//Register action filter via Autofac rather than GlobalFilters to allow dependency injection
builder.RegisterFilterProvider();
builder.RegisterType<OfflineActionFilter>()
    .AsActionFilterFor<Controller>()
    .InstancePerLifetimeScope();

我只能得出结论,Autofac的RegisterFilterProvider中的某些内容破坏或覆盖validateRequest属性

其他回答

只要这些字符只是“<”和“>”(而不是双引号本身),并且您在上下文中使用它们,例如<input value=“this”/>,您就安全了(而对于<textarea>这一个</textarea>,您当然会受到攻击)。这可能会简化您的情况,但要做更多的事情,请使用其他发布的解决方案之一。

如果您使用的是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:Textbox控件(asp.net4.5),而不是设置validateRequest=“false”的所有页面我用过

<asp:TextBox runat="server" ID="mainTextBox"
            ValidateRequestMode="Disabled"
 ></asp:TextBox>

在导致异常的文本框上。

如何在ASP.NET 4.6.2中修复AjaxExtControls的此问题:

我们在AjaxExtControls富文本编辑器中遇到了同样的问题。此问题在从.NET 2.0升级到.NET 4.5后立即开始。我查看了SOF的所有答案,但没有找到一个不损害.NET4.5提供的安全性的解决方案。

修复1(不推荐,因为它会降低应用程序的安全性):我在requestValidationMode=“2.0,它起了作用,但我担心安全特性。因此,这是一个修复,就像降低了整个应用程序的安全性。

修复2(推荐):由于这个问题只发生在AjaxExtControl中的一个,我最终能够使用下面的简单代码解决这个问题:

editorID.value = editorID.value.replace(/>/g, "&gt;");
editorID.value = editorID.value.replace(/</g, "&lt;");

在向服务器发送请求之前,在客户端(javascript)上执行此代码。注意,editorID不是我们在html.aspx页面上的ID,而是AjaxExtControl内部使用的富文本编辑器的ID。

您可以对文本框内容进行HTML编码,但不幸的是,这并不能阻止异常的发生。根据我的经验,没有办法,您必须禁用页面验证。你这样做是在说:“我会小心的,我保证。”