ActionFilterAttribute - 一个潜在危险的Request.Form值

时间:2015-01-10 21:58:21

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

我有一个审核系统,当表单值包含HTML时失败。

我已将[AllowHtml]属性添加到相关的模型属性中,并尝试将[ValidateInput(false)]添加到控制器操作,以及在{{1上使用Unvalidated()扩展方法}}

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

OnActionExecuting()

错误是:

  

类型的第一次机会异常   ' System.Web.HttpRequestValidationException'发生在System.Web.dll

中      

其他信息:一个潜在危险的Request.Form值   从客户端检测到(注意=" ActionFilterAttribute")。

"注意"是return Json.Encode(new { request.Cookies, request.Headers, request.Files, request.Form, request.QueryString, request.Params }); 上的模型属性。

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

1 个答案:

答案 0 :(得分:2)

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