【问题标题】:Unvalidated IValueProvider.GetValue未经验证的 IValueProvider.GetValue
【发布时间】:2011-06-20 14:16:12
【问题描述】:

在我使用的自定义模型绑定器中

bindingContext.ValueProvider.GetValue(propertyName);

我确实在操作上有 [ValidateInput(false)]。但是上面的 GetValue 调用会导致

从客户端检测到有潜在危险的 Request.QueryString 值

如何让我的自定义模型绑定器从值提供者那里获得未经验证的值?当然当它发现action上有ValidateInput(false)时。

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    万一有人好奇,这里有一个快速的解决方案。只需在 BindModel/BindProperty 方法中调用 CheckUnvalidated()。这会将默认的 QueryStringValueProvider 替换为未经验证的版本。

      MethodInfo GetActionMethod(ControllerContext controllerContext)
      {
         var action = controllerContext.RouteData.Values["action"] as string;
         return controllerContext.Controller.GetType().GetMethods().FirstOrDefault(x => x.Name == action ||
            x.GetCustomAttribute<ActionNameAttribute>().SafeGet(a => a.Name) == action);
      }
    
      void CheckUnvalidated(ControllerContext controllerContext, ModelBindingContext bindingContext)
      {
         var method = GetActionMethod(controllerContext);
         if (method == null)
            return;
         if (method.GetCustomAttribute<ValidateInputAttribute>().SafeGet(x => x.EnableValidation, true))
            return;
         var collection = bindingContext.ValueProvider as ValueProviderCollection;
         if (collection == null)
            return;
         var old = collection.OfType<QueryStringValueProvider>().FirstOrDefault();
         if (old != null)
            collection.Remove(old);
         collection.Add(new UnvalidatedQueryStringValueProvider(controllerContext));
      }
    
      class UnvalidatedQueryStringValueProvider : NameValueCollectionValueProvider
      {
         public UnvalidatedQueryStringValueProvider(ControllerContext controllerContext)
            : base(controllerContext.HttpContext.Request.Unvalidated().QueryString, CultureInfo.InvariantCulture)
         {
             }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多