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

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

我不想谈论抛出异常或崩溃整个Web应用程序的聪明之处,因为有人在文本框中输入了一个字符,但是我正在寻找一种优雅的方式来处理这个问题。

捕获异常并显示

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

对我来说似乎不够专业。

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

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

有没有一种方法可以从处理程序执行此操作?


我认为你是通过试图编码所有发布的数据来从错误的角度来攻击它。

请注意,“ < ”也可能来自其他外部来源,如数据库字段,配置,文件,提要等。

此外,“ < ”不是固有的危险。 在特定的上下文中这仅仅是危险的:当编写未被编码为HTML输出的字符串时(由于XSS)。

在其他上下文中,不同的子字符串是危险的,例如,如果您将用户提供的URL写入链接,则子字符串“ javascript: ”可能很危险。 另一方面,在SQL查询中插入字符串时,单引号字符是危险的,但如果它是从表单提交的名称或从数据库字段读取的名称的一部分,则该字符非常安全。

底线是:你无法过滤危险字符的随机输入,因为任何字符在正确的情况下可能是危险的。 您应该在某些特定字符可能变得危险的地方进行编码,因为它们会跨越到具有特殊含义的不同子语言。 在向HTML写入字符串时,应使用Server.HtmlEncode对HTML中具有特殊含义的字符进行编码。 如果你将一个字符串传递给一个动态SQL语句,你应该编码不同的字符(或者更好,让框架通过使用准备好的语句等来为你做)。

如果您确信HTML编码是将字符串传递给HTML的,则在.aspx文件的<%@ Page ... %>指令中设置validateRequest="false"

在.NET 4中,您可能需要做更多。 有时还需要在web.config(reference)中添加<httpRuntime requestValidationMode="2.0" />


如果您使用ASP.NET MVC,则会出现此错误的不同解决方案:

  • ASP.NET MVC - 页面validateRequest = false不起作用?
  • 为什么ValidateInput(False)不起作用?
  • ASP.NET MVC RC1,VALIDATEINPUT,潜在的危险请求和PITFALL
  • C#示例:

    [HttpPost, ValidateInput(false)]
    public ActionResult Edit(FormCollection collection)
    {
        // ...
    }
    

    Visual Basic示例:

    <AcceptVerbs(HttpVerbs.Post), ValidateInput(False)> _
    Function Edit(ByVal collection As FormCollection) As ActionResult
        ...
    End Function
    

    在ASP.NET MVC中(从版本3开始),可以将AllowHtml属性添加到模型的属性中。

    它允许请求在模型绑定期间通过跳过属性的请求验证来包含HTML标记。

    [AllowHtml]
    public string Description { get; set; }
    
    链接地址: http://www.djcxy.com/p/48117.html

    上一篇: A potentially dangerous Request.Form value was detected from the client

    下一篇: ASP.NET MVC: Unit testing controllers that use UrlHelper