【问题标题】:ActionFilterAttribute - A potentially dangerous Request.Form valueActionFilterAttribute - 一个潜在危险的 Request.Form 值
【发布时间】:2015-01-10 21:58:20
【问题描述】:

我的审核系统在表单值包含 HTML 时失败。

我已将[AllowHtml] 属性添加到有问题的模型属性中,并尝试将[ValidateInput(false)] 添加到控制器操作中,以及在HttpRequestBase 上使用Unvalidated() 扩展方法。

这些都不能防止错误。它失败的代码行(在审计代码中,派生的ActionFilterAttributeOnActionExecuting())是:

return Json.Encode(new { request.Cookies, request.Headers, request.Files, request.Form, request.QueryString, request.Params });

错误是:

类型的第一次机会异常 System.Web.dll 中发生“System.Web.HttpRequestValidationException”

附加信息:有潜在危险的 Request.Form 值是 从客户端检测到 (Note="<p>test</p>")。

“Note”是带有[AllowHtml]的模型属性。

关于如何防止这种情况的任何想法?

【问题讨论】:

    标签: c# asp.net-mvc entity-framework


    【解决方案1】:

    了解 ASP.NET MVC 管道中的操作顺序很重要。在控制器中的操作开始之前,您的 OnActionExecuting 方法就会被调用。如果您的控制器操作尚未执行,则意味着您的 ValidateInput 注释未被考虑。这也意味着模型绑定尚未发生,因此您的 AllowHtml 注释不被考虑。此时,您已经可以访问基本的Form 集合,当您尝试通过Json.Encode() 序列化访问数据时,ASP.NET 的安全保护仍在发挥作用。

    要解决此问题,您可以在 Web.config 中完全禁用请求验证(不推荐),或者更加注意 JSON 序列化。为此,您必须在展开属性值时调用Unvalidated()

    return Json.Encode(new {
        request.Cookies,
        request.Headers,
        request.Files,
        new {
            Note = Request.Unvalidated().Form["Note"]
            //Add any other properties you care about here
        },
        request.Form,
        request.QueryString,
        request.Params
     });
    

    【讨论】:

    • 操作的管道顺序完全有意义,谢谢。我的问题是我无法引用特定属性,因为此属性应用于跨控制器的各种操作方法。我尝试用 request.Unvalidated.Form 替换 request.Form 但这并不能解决问题。
    • 在这种情况下,我会让您的操作过滤器属性接受一个参数(可能是string[]),该参数指定您不想验证的属性名称。鉴于此,您可以遍历字符串数组并使用以下内容查找属性:Request.Unvalidated().Form[propertyName]
    • [Allow HTML], [ValidateInput(false)] 不起作用,onActionExecuted方法,当试图从request中获取参数时,所以试图从Request.Unvalidated中获取参数
    猜你喜欢
    • 2011-06-21
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 2011-03-30
    相关资源
    最近更新 更多