2017-06-05 41 views
1

我希望能夠做到在內容類型RequestValidation「應用/ JSON」以一致的方式,以表單驗證(「應用程序/ x-WWW的形式,進行了urlencoded」 )。ASP.Net RequestValidation JSON的POST匹配表RequestValidation

我讀過https://msdn.microsoft.com/en-us/library/system.web.util.requestvalidator(v=vs.110).aspx但一直沒有太大的幫助。

我期待在試圖實現一個自定義的請求驗證來替換默認System.Web.Util.RequestValidator。

我也看了https://msdn.microsoft.com/en-us/library/system.web.util.requestvalidator(v=vs.110).aspx

如果我不能得到的輸入被一致確認,我可能會刪除通過形式JSON發送到控制器,並且強制所有的能力 - 並不理想,因爲我d喜歡一些接受json的方法。

我已經編碼輸出(如果可能),但我仍希望深度防禦通過驗證輸入和理想一致的形式和JSON。

不幸的是,很多在這個MSDN文檔是嚴重過時,現在無關的。

我使用.net 4.6.1作爲參考。

以這種方式嘗試驗證請求是否明智?

+0

[自定義請求驗證](https://msdn.microsoft.com/en-us/library/system.web.util。 requestvalidationsource(v = vs.110).aspx)希望它有幫助 –

回答

0

最終我實現了一個自定義的模型綁定器......這是閱讀本https://weblogs.asp.net/imranbaloch/security-issue-in-asp-net-mvc3-jsonvalueproviderfactory組合,這https://gist.github.com/jamescrowley/b8c0c006e7b00e28cbbf

它修改請求的源(RequestValidationSource.Form),使它看起來像一個形式,因此可以在同一管道中進行驗證。

public class JsonValidatingModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var result = base.BindModel(controllerContext, bindingContext); 
     if (!IsJsonRequest(controllerContext)) 
     { 
      return result; 
     } 
     if (!bindingContext.ModelMetadata.RequestValidationEnabled) 
     { 
      return result; 
     } 
     if (result != null) 
     { 
      EnsureRequestFieldIsValid(controllerContext, result); 
     } 
     return result; 
    } 

    static void EnsureRequestFieldIsValid(ControllerContext controllerContext, object result) 
    { 
     int index; 
     // abusing RequestValidationSource enum 
     if (!RequestValidator.Current.InvokeIsValidRequestString(
      controllerContext.HttpContext.ApplicationInstance.Context, 
      result.ToString(), RequestValidationSource.Form, null, out index)) 
     { 
      throw new HttpRequestValidationException(
       "A potentially dangerous value was detected from the client "); 
     } 
    } 

    static bool IsJsonRequest(ControllerContext controllerContext) 
    { 
     return controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase); 
    } 

和在Global.asax ...

protected void Application_Start() 
    { 
     System.Web.Mvc.ModelBinders.Binders.DefaultBinder = new JsonValidatingModelBinder(); 

    }