C# ActionFilterAttribute-潜在危险的请求。表单值
我有一个审计系统,当表单值包含HTML时会失败 我已将C# ActionFilterAttribute-潜在危险的请求。表单值,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我有一个审计系统,当表单值包含HTML时会失败 我已将[allowtml]属性添加到相关的模型属性中,并尝试将[ValidateInput(false)]添加到控制器操作中,以及使用HttpRequestBase上的Unvalidated()扩展方法 所有这些都不能阻止错误的发生。它失败的代码行(在派生的ActionFilterAttribute的审核代码中,OnActionExecuting())是: 错误是: 类型的第一次机会例外 System.Web.dll中出现“System.Web.H
[allowtml]
属性添加到相关的模型属性中,并尝试将[ValidateInput(false)]
添加到控制器操作中,以及使用HttpRequestBase
上的Unvalidated()
扩展方法
所有这些都不能阻止错误的发生。它失败的代码行(在派生的ActionFilterAttribute
的审核代码中,OnActionExecuting()
)是:
错误是:
类型的第一次机会例外
System.Web.dll中出现“System.Web.HttpRequestValidationException”
其他信息:潜在危险的请求。表单值为
从客户端检测到(注意=“测试”
”)
“Note”是带有[AllowHtml]
的模型属性
有没有关于如何防止这种情况的想法?了解ASP.NET MVC管道中的操作顺序很重要。您的
OnActionExecuting
方法在控制器中的操作开始之前被调用。如果尚未执行控制器操作,则表示未考虑ValidateInput
注释。这还意味着没有进行模型绑定,因此不考虑您的allowtml
注释。此时,您刚刚可以访问基本的表单
集合,当您尝试通过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.Form替换为request.Unvalidated.Form,但这并不能解决问题。在这种情况下,我会让您的操作筛选器属性包含一个参数(可能是一个
字符串[]
),该参数指定您不希望验证的属性名称。考虑到这一点,您可以迭代字符串数组,并使用类似以下内容查找属性:Request.Unvalidated().Form[propertyName]
[Allow HTML],[ValidateInput(false)]不起作用,当尝试从请求获取参数时,onActionExecuted方法会尝试从请求获取参数。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
});