ASP.NET MVC使用自定义模型绑定器时,从客户端检测到一个潜在危险的Request.Form值

D-W*_*D-W 91 asp.net-mvc custom-model-binder

在这里得到错误:

ValueProviderResult value = bindingContext.ValueProvider.GetValue("ConfirmationMessage");
Run Code Online (Sandbox Code Playgroud)

如何仅允许选择值?即

[ValidateInput(false)]
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
    ValueProviderResult value = bindingContext.ValueProvider.GetValue("ConfirmationMessage");
    ValueProviderResult value2 = bindingContext.ValueProvider.GetValue("ConfirmationMessage2");
}
Run Code Online (Sandbox Code Playgroud)

eri*_*cdc 209

你有几个选择.

在模型上,将此属性添加到您需要允许HTML的每个属性 - 最佳选择

using System.Web.Mvc;

[AllowHtml]
public string SomeProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

在控制器操作上添加此属性以允许所有HTML

[ValidateInput(false)]
public ActionResult SomeAction(MyViewModel myViewModel)
Run Code Online (Sandbox Code Playgroud)

web.config中的暴力 - 绝对不推荐

在web.config文件中,在标记内插入带有属性requestValidationMode ="2.0"的httpRuntime元素.还要在pages元素中添加validateRequest ="false"属性.

<configuration>
  <system.web>
   <httpRuntime requestValidationMode="2.0" />
  </system.web>
  <pages validateRequest="false">
  </pages>
</configuration>
Run Code Online (Sandbox Code Playgroud)

更多信息:http://davidhayden.com/blog/dave/archive/2011/01/16/AllowHtmlAttributeASPNETMVC3.aspx

以上适用于默认模型绑定器的使用.

自定义ModelBinder

看起来上面代码中对bindingContext.ValueProvider.GetValue()的调用总是验证数据,无论属性如何.深入研究ASP.NET MVC源显示DefaultModelBinder首先检查是否需要请求验证,然后使用指示是否需要验证的参数调用bindingContext.UnvalidatedValueProvider.GetValue()方法.

遗憾的是,我们不能使用任何框架代码,因为它是密封的,私有的或任何保护无知的开发人员不做危险的东西,但是创建一个尊重AllowHtml和ValidateInput属性的工作自定义模型绑定器并不太难:

public class MyModelBinder: IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        // First check if request validation is required
        var shouldPerformRequestValidation = controllerContext.Controller.ValidateRequest && bindingContext.ModelMetadata.RequestValidationEnabled;

        // Get value
        var valueProviderResult = bindingContext.GetValueFromValueProvider(shouldPerformRequestValidation);
        if (valueProviderResult != null)
        {
            var theValue = valueProviderResult.AttemptedValue;

            // etc...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

另一个必需的部分是检索未经验证的值的方法.在这个例子中,我们使用ModelBindingContext类的扩展方法:

public static class ExtensionHelpers
{
    public static ValueProviderResult GetValueFromValueProvider(this ModelBindingContext bindingContext, bool performRequestValidation)
    {
        var unvalidatedValueProvider = bindingContext.ValueProvider as IUnvalidatedValueProvider;
        return (unvalidatedValueProvider != null)
          ? unvalidatedValueProvider.GetValue(bindingContext.ModelName, !performRequestValidation)
          : bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
    }
}
Run Code Online (Sandbox Code Playgroud)

有关此内容的更多信息,请访问http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/


D-W*_*D-W 29

尝试:

HttpRequestBase request = controllerContext.HttpContext.Request;
string re = request.Unvalidated.Form.Get("ConfirmationMessage")
Run Code Online (Sandbox Code Playgroud)

  • 第二行应该是`var re = request.Unvalidated.Form ["ConfirmationMessage"];` (7认同)

Mik*_*din 6

扩展来自@DW 的答案,在我的 Edit 控制器中,在迭代表单值时,我必须替换Request.Params.AllKeyswith 的Request.Unvalidated.Form.AllKeys所有实例和Request[key]with 的所有实例Request.Unvalidated.Form[key]

这是唯一对我有用的解决方案。