代码之家  ›  专栏  ›  技术社区  ›  Erv Walter

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

  •  3
  • Erv Walter  · 技术社区  · 14 年前

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

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

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

    当一篇文章包含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和.net4,这个开始出现。从堆栈跟踪来看,验证似乎是作为对HTTP方法重写的新支持处理的一部分进行的(通过包含一个特别命名的隐藏输入,使POST看起来像PUT或DELETE)。但我不知道如何告诉子系统停止验证输入。

    我需要做些什么才能让它工作?

    2 回复  |  直到 14 年前
        1
  •  4
  •   Necros    14 年前

    将此添加到 system.web

    <httpRuntime requestValidationMode="2.0" />
    
        2
  •  4
  •   BritishDeveloper    14 年前

    是 啊 .NET4 upped the security a bit

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