即使验证被禁用,ASP.NET请求验证异常

时间:2010-08-19 14:52:41

标签: asp.net-mvc asp.net-mvc-2 validation

我正在使用ASP.NET MVC 2,.NET 4.0。

我有一个禁用请求验证的控制器:

[AcceptVerbs("POST")]
[ValidateInput(false)]
public ActionResult Add(string userId, FormCollection formValues)
{
    //...
}

当POST包含HTML时,我仍然会收到HttpRequestValidationException:

System.Web.HttpRequestValidationException (0x80004005): A potentially dangerous Request.Form value was detected from the client (ThisWeek="").
   at System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection)
   at System.Web.HttpRequest.ValidateNameValueCollection(NameValueCollection nvc, RequestValidationSource requestCollection)
   at System.Web.HttpRequest.get_Form()
   at System.Web.Mvc.HttpRequestExtensions.GetHttpMethodOverride(HttpRequestBase request)
   at System.Web.Mvc.AcceptVerbsAttribute.IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
   at System.Linq.Enumerable.All[TSource](IEnumerable`1 source, Func`2 predicate)
   at System.Web.Mvc.ActionMethodSelector.RunSelectionFilters(ControllerContext controllerContext, List`1 methodInfos)
   at System.Web.Mvc.ReflectedControllerDescriptor.FindAction(ControllerContext controllerContext, String actionName)
   at System.Web.Mvc.ControllerActionInvoker.FindAction(ControllerContext controllerContext, ControllerDescriptor controllerDescriptor, String actionName)
   at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
   at System.Web.Mvc.Controller.ExecuteCore()
   at System.Web.Mvc.MvcHandler.c__DisplayClass8.b__4()
   at System.Web.Mvc.Async.AsyncResultWrapper.c__DisplayClass1.b__0()
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

我需要在输入中允许HTML文本,因为应用程序是一个错误跟踪系统,人们在他们的错误提交中谈论HTML。我正确处理此操作的输入并在重新输出时对事物进行适当编码,因此禁用此操作的验证是合理的。

我们最近切换到MVC2和.NET 4,这开始出现。从堆栈跟踪看来,验证是作为处理HTTP方法覆盖的新支持的一部分而发生的(通过包含特殊命名的隐藏输入使POST看起来像PUT或DELETE)。但我不知道如何告诉该子系统停止验证输入。

我需要做些什么来完成这项工作?

2 个答案:

答案 0 :(得分:4)

将此添加到您的web.config的system.web部分:

<httpRuntime requestValidationMode="2.0" />

答案 1 :(得分:4)

是的.NET4 upped the security a bit。您可以在web.config中将其恢复为.NET2模式,如下所示:

<system.web>
  <httpRuntime requestValidationMode="2.0"/>
</system.web>