Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ActionFilterAttribute-潜在危险的请求。表单值_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# ActionFilterAttribute-潜在危险的请求。表单值

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

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

我已将
[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
 });