从客户端检测到潜在的危险Request.Form值

每次用户在Web应用程序的页面中发布包含<>时,都会引发此异常。

我不想讨论引发异常或崩溃整个Web应用程序的明智性,因为有人在文本框中输入了字符,但是我正在寻找一种优雅的方式来解决这个问题。

捕获异常并显示

发生错误,请返回并重新输入整个表格,但是这次请不要使用<

在我看来还不够专业。

禁用后验证( validateRequest="false" )肯定会避免此错误,但是它将使页面容易受到多种攻击。

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

有没有办法可以从处理程序做到这一点?


#1楼

在ASP.NET中,您可以捕获异常并对其进行处理,例如显示友好的消息或重定向到另一个页面。此外,您还可以自己处理验证...

显示友好的消息:

protected override void OnError(EventArgs e)
{
    base.OnError(e);
    var ex = Server.GetLastError().GetBaseException();
    if (ex is System.Web.HttpRequestValidationException)
    {
        Response.Clear();
        Response.Write("Invalid characters."); //  Response.Write(HttpUtility.HtmlEncode(ex.Message));
        Response.StatusCode = 200;
        Response.End();
    }
}

#2楼

我最终在每次回发之前都使用JavaScript来检查不需要的字符,例如:

<asp:Button runat="server" ID="saveButton" Text="Save" CssClass="saveButton" OnClientClick="return checkFields()" />

function checkFields() {
    var tbs = new Array();
    tbs = document.getElementsByTagName("input");
    var isValid = true;
    for (i=0; i<tbs.length; i++) {
        if (tbs(i).type == "text") {
            if (tbs(i).value.indexOf("<") != -1 || tbs(i).value.indexOf(">") != -1) {
                alert("<> symbols not allowed.");
                isValid = false;
            }
        }
    }
    return isValid;
}

当然,我的页面主要是数据输入,很少有元素可以进行回发,但是至少保留了它们的数据。


#3楼

我也收到此错误。

在我的情况下,用户在“角色名称”(关于ASP.NET成员资格提供程序)中输入了重音符号á

我将角色名称传递给一种方法,以向用户授予该角色,然后$.ajax发布请求失败了……

我这样做是为了解决问题:

代替

data: { roleName: "@Model.RoleName", users: users }

做这个

data: { roleName: "@Html.Raw(@Model.RoleName)", users: users }

@Html.Raw做到了。

我得到的角色名称是HTML值roleName="Cadastro b&#225;s" 。 HTML实体的此值&#225; 被ASP.NET MVC阻止。 现在,我以应有的方式获取roleName参数值: roleName="Cadastro Básico" ,ASP.NET MVC引擎将不再阻止请求。


#4楼

对于ASP.NET 4.0,可以将标记全部放入<location>元素中,从而允许标记作为特定页面而不是整个站点的输入。 这将确保您所有其他页面都是安全的。 您无需在.aspx页中放入ValidateRequest="false"

<configuration>
...
  <location path="MyFolder/.aspx">
    <system.web>
      <pages validateRequest="false" />
      <httpRuntime requestValidationMode="2.0" />
    </system.web>
  </location>
...
</configuration>

在web.config中进行控制比较安全,因为您可以在站点级别看到哪些页面允许标记作为输入。

您仍然需要以编程方式验证禁用请求验证的页面上的输入。


#5楼

没有任何建议对我有用。 我不想关闭整个网站的此功能,因为99%的时间我不希望我的用户将HTML放置在Web表单上。 我只是围绕方法创建了自己的工作,因为我是唯一使用此特定应用程序的方法。 我在后面的代码中将输入转换为HTML,然后将其插入数据库。