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

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

捕获异常并显示

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

我觉得不够专业。

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

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

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


当前回答

您可以在Global.asax中捕捉到该错误。我仍然想验证,但显示了一条适当的消息。在下面列出的博客上,有一个这样的示例。

    void Application_Error(object sender, EventArgs e)
    {
        Exception ex = Server.GetLastError();

        if (ex is HttpRequestValidationException)
        {
            Response.Clear();
            Response.StatusCode = 200;
            Response.Write(@"[html]");
            Response.End();
        }
    }

重定向到另一个页面似乎也是对异常的合理响应。

http://www.romsteady.net/blog/2007/06/how-to-catch-httprequestvalidationexcep.html

其他回答

前面的答案很好,但没有人说过如何排除一个字段进行HTML/JavaScript注入的验证。我不知道以前的版本,但在MVC3 Beta版中,您可以这样做:

[HttpPost, ValidateInput(true, Exclude = "YourFieldName")]
public virtual ActionResult Edit(int id, FormCollection collection)
{
    ...
}

这仍然会验证除排除的字段之外的所有字段。这一点的好处是,您的验证属性仍然验证字段,但您没有得到“潜在危险的请求。表单值已从客户端检测到”异常。

我已经用它验证了正则表达式。我制作了自己的ValidationAttribute,以查看正则表达式是否有效。由于正则表达式可以包含类似于脚本的内容,我应用了上面的代码-正则表达式仍然在检查是否有效,但不检查是否包含脚本或HTML。

如果您使用的是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”%>

我建议不要这样做。

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

在.Net 4.0及更高版本(通常情况下)中,将以下设置放入system.web中

<system.web>
     <httpRuntime requestValidationMode="2.0" />

这些建议对我都不起作用。无论如何,我不想关闭整个网站的这个功能,因为99%的时间我不希望我的用户在web表单上放置HTML。我刚刚创建了自己的变通方法,因为我是唯一一个使用这个特定应用程序的人。我在后面的代码中将输入转换为HTML并将其插入数据库。