ActionFilterAttribute - 具有潜在危险的 Request.Form 值

ActionFilterAttribute - A potentially dangerous Request.Form value

我有一个审计系统在表单值包含 HTML.

时失败

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

上的扩展方法

None 这是为了防止错误。它失败的代码行(在审计代码中,派生 ActionFilterAttributeOnActionExecuting())是:

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

错误是:

A first chance exception of type 'System.Web.HttpRequestValidationException' occurred in System.Web.dll

Additional information: A potentially dangerous Request.Form value was detected from the client (Note="<p>test</p>").

"Note" 是模型 属性 上面有 [AllowHtml]

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

了解 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
 });