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

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

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

捕获异常并显示 ajax

发生错误,请返回并从新输入整个表格,可是此次请不要使用< 数据库

在我看来还不够专业。 编程

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

理想状况下:当发生包含HTML受限字符的回发时,Form集合中的已发账值将自动进行HTML编码。 所以,个人文本框的.Text属性将是something & lt; html & gt; something & lt; html & gt; ide

有没有办法能够从处理程序作到这一点? 网站


#1楼

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

显示友好的消息: spa

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,而后将其插入数据库。

相关文章
相关标签/搜索