2011-06-20 9 views
7

は私が未検証IValueProvider.GetValue

bindingContext.ValueProvider.GetValue(propertyName); 

を使用して、私のカスタムモデルバインダーでは、私はアクションに[ValidateInput(偽)]を持っています。

潜在的に危険な場合、Request.QueryString値

で結果上記GetValueメソッド呼び出しがクライアントから検出されたが

は、どのように私は私のカスタムモデルバインダーは、値プロバイダから未検証の値を取得するのですか?もちろん、アクションにValidateInput(false)があることがわかったとき。

答えて

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) 
    { 
     } 
    } 
関連する問題