我有一个审核系统,当表单值包含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 });
上的模型属性。
关于如何防止这种情况的任何想法?
答案 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
});