检测到潜在危险的Request.Form值

时间:2011-05-09 12:50:59

标签: asp.net-mvc

我有一个带有wmd编辑器的表单。输入文本区域使用以下方式呈现:

<%: Html.TextAreaFor(t => t.NewsBody, new{@class="wmd-panel", id="wmd-input"}) %>

每次提交表单时,我都会A potentially dangerous Request.Form value was detected from the client

我尝试在action方法上设置[ValidateInput(false)],我尝试将 <httpRuntime requestValidationMode="2.0" />添加到web.config中,我在web.config中的pages指令中尝试了validateRequest="false"但它是还在发生。

有什么想法吗?

修改

行动方法:

 [ILFFAuthorize(Roles = "Admin")] // this is a custom auth attrobite
        [HttpPost]
        [ValidateInput(false)]
        public ActionResult AddNews(FormCollection col){

        //public ActionResult AddNews(News news)
        //{
            if (ModelState.IsValid)
            {
                News news = new News();
                news.NewsDate = DateTime.Now;
                news.NewsPosterId = 0;

                news.NewsTitle = col["NewsTitle"];
                news.NewsBody = col["NewsBody"];
                newsRepository.Add(news);
                newsRepository.Save();

                return RedirectToAction("Index", "Home");
            }
            else
            {
                return View();
            }
        }

6 个答案:

答案 0 :(得分:25)

您需要将其置于[HttpPost]操作方法

之上
    [HttpPost]
    [ValidateInput(false)]
    public ActionResult Edit(FormCollection collection) {
       .....
    }

如果您使用的是MVC3,那么您不应该使用[ValidateInput(false)],而是使用此处说明的[AllowHtml]http://dailydotnettips.com/2011/08/24/how-to-allow-user-to-input-html-in-asp-net-mvc/

同时:尝试将[ValidateInput(false)]放在[HttpPost]以下,而不记得,这些是从上到下执行的。

答案 1 :(得分:6)

在MVC 3中,将[AllowHtml]添加到视图模型中您不想验证的属性。

答案 2 :(得分:4)

在web.config文件中,在标记内插入httpRuntime元素,其属性为requestValidationMode =“2.0”。还要在pages元素中添加validateRequest =“false”属性。

示例:

<configuration>
  <system.web>
   <httpRuntime requestValidationMode="2.0" />
  </system.web>
  <pages validateRequest="false">
  </pages>
</configuration>

答案 3 :(得分:2)

一般的经验法则是,在发布到不允许存在潜在危险的表单值的操作方法时,您将收到该错误。如果你考虑到这一点以及你明显选择在给定的动作方法上允许这些值的事实,你必须得出结论,你以某种方式发布到不同的动作方法。

您可以尝试在没有大规模杀伤性武器的情况下发布标准字符串(即“你好”)并检查是否已达到所选操作方法中的断点吗?

答案 4 :(得分:2)

使用 [ValidateInput(false)] 来解决这些类型的错误

这是因为用户输入包含各种html标签。因此,MVC3体系结构没有此类输入的权限。

  

我们可以删除在操作结果上方或我们提交表单的位置写 [ValidateInput(false)] 时出现此错误。此命令将禁用html标记的表单验证。

答案 5 :(得分:0)

我试着整天找到解决这个问题的方法。
禁用验证不是一种选择。
添加allowHtml也不是一个选项,因为通过msdn规范:
AllowHtmlAttribute允许请求在模型绑定期间通过跳过属性的请求验证来包含HTML标记。 source

此外,如果默认验证设置为false,则项目中的字符串属性有很多属性应该进行验证。

解决方案:

我创建了一个CustomRequestValidation类:

public class CustomRequestValidation : System.Web.Util.RequestValidator
{
    protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
    {
        validationFailureIndex = -1;
        if (requestValidationSource == RequestValidationSource.RawUrl)
            return true;

        if (requestValidationSource == RequestValidationSource.Form)
        {
            var isValid = base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);
            if (!isValid)
            {
                validationFailureIndex = -1;
                return true;
            }
        }

        return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);
    }
}

它的作用是它只是为了达到模型状态而跳过RequestValidation。

接下来,我已经覆盖了默认的模型绑定器:

public class CustomModelBinder : DefaultModelBinder
{

    protected override bool OnPropertyValidating(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, object value)
    {
        if (value != null)
        {
            if (propertyDescriptor.PropertyType == typeof(string))
            {
                string val = value.ToString();
                int validationIndex;
                var isValid = new System.Web.Util.RequestValidator().InvokeIsValidRequestString(controllerContext.HttpContext.ApplicationInstance.Context, val, RequestValidationSource.Form, null, out validationIndex);
                if (!isValid && !propertyDescriptor.Attributes.OfType<AllowHtmlAttribute>().IsAny())
                {
                    var key = CreateSubPropertyName(bindingContext.ModelName, propertyDescriptor.Name);
                    bindingContext.ModelState.AddModelError(key, ErrorConstants.SpecialCharacters);
                }
            }
        }

        return base.OnPropertyValidating(controllerContext, bindingContext, propertyDescriptor, value);
    }
}

现在我们在这里进行所有验证。在模型绑定器中,我调用默认的.Net IsValidRequestString方法以及检查是否设置了AllowHtml,并相应地设置模型状态。它让我可以控制数据,我可以返回到页面并使用先前输入的数据填充表单,而无需触发插入的脚本。我使用的是强类型模型。