我正在开发一个从我最近从MVC 1 / .NET 2 / 3.5升级到MVC2 / .NET 4的另一个开发商店继承的应用程序。除了一页外,一切正常。在这个页面上有一个iframe,它加载了一个TinyMCE实例,并允许内联编辑一些HTML模板。在托管页面上有一个连接到提交按钮的JavaScript事件,单击该视图时,抓取iframe的innerHtml值,将其转换为JSON,并将其放入隐藏的表单字段中。
作为表格帖子,我得到了臭名昭着的“一个有潜在危险的Request.Form值被检测到......”现在我跟着微软的白皮书并添加了
<httpRuntime requestValidationMode="2.0" />
到我的web.config并用
装饰我的Controller[ValidateInput(false)]
我仍然收到此错误。相关的堆栈如下。
[HttpRequestValidationException (0x80004005): A potentially dangerous Request.Form value was detected from the client (HtmlContent="...orrectly? <a href=\"*|ARCHIVE|...").]
System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection) +8730676
System.Web.HttpRequest.ValidateNameValueCollection(NameValueCollection nvc, RequestValidationSource requestCollection) +122
System.Web.HttpRequest.get_Form() +114
System.Web.HttpRequestWrapper.get_Form() +11
System.Web.Mvc.HttpRequestExtensions.GetHttpMethodOverride(HttpRequestBase request) +235
System.Web.Mvc.AcceptVerbsAttribute.IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) +119
System.Web.Mvc.<>c__DisplayClass11.<RunSelectionFilters>b__d(ActionMethodSelectorAttribute attr) +57
System.Linq.Enumerable.All(IEnumerable`1 source, Func`2 predicate) +145
System.Web.Mvc.ActionMethodSelector.RunSelectionFilters(ControllerContext controllerContext, List`1 methodInfos) +524
System.Web.Mvc.ActionMethodSelector.FindActionMethod(ControllerContext controllerContext, String actionName) +122
System.Web.Mvc.ReflectedControllerDescriptor.FindAction(ControllerContext controllerContext, String actionName) +182
System.Web.Mvc.ControllerActionInvoker.FindAction(ControllerContext controllerContext, ControllerDescriptor controllerDescriptor, String actionName) +47
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +283
System.Web.Mvc.Controller.ExecuteCore() +136
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +111
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +39
System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__4() +65
System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +44
System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +42
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +140
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +54
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +52
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +38
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8836913
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184
有趣的是,如果我在Global.asax中挂钩BeginRequest方法,这似乎表明代码在2.0模式的请求验证下运行,因为如果我对.NET 4s请求验证的理解是正确的,我会如果代码在4.0验证模型下运行,则无法使用此方法,因为它在BeginRequest之前处理所有内容。
现在我能够通过从隐藏表单字段的值上调用JavaScript函数中的escape()来避免这个问题,但这显然是一个黑客攻击。有没有其他人遇到过这个问题,或者知道如何在我的控制器上正确禁用此方法的请求验证?
谢谢!
答案 0 :(得分:0)
检查web.config中的“pages”部分是否为:
<pages validateRequest="false" ...>...</pages>
如果没有尝试添加validateRequest属性。这对我有用,因为几个月前我遇到了同样的问题。
编辑:lol,我没有看到它是如此古老的帖子。但我离开了我的衣服,因为它可能会帮助别人