2017-03-09 39 views
1

我試圖處理好以下幾個問題處理,但此錯誤

的通知用戶有潛在危險的Request.Form值從客戶端檢測到'「是從檢測到有潛在危險的Request.Form值在 客戶」

不過,我不能找到一個很好的教程,介紹瞭如何抓住這個錯誤並處理它。只是爲了清楚,我想在填寫表單時阻止用戶輸入任何標記。處理此問題的大多數文章都提示關閉請求驗證。這不是我想要做的事情。我想捕捉錯誤並將錯誤回放給用戶。任何幫助將不勝感激。

+0

也許這會容易的HTML,但只是從輸入值剝離任何標記? –

+0

@TiesonT。有很多東西/各種攻擊被驗證過濾出來 - 認爲你可以做得比ASP.Net更好。 – caesay

+0

@caesay我不是建議關閉請求驗證。我建議將AllowHtmlAttribute添加到OP正在使用的任何模型中,然後清理輸入。 –

回答

2

您可以使用異常過濾器捕獲錯誤。喜歡的東西:

public class RequestValidationExceptionFilter : IExceptionFilter 
{ 
    public void OnException(ExceptionContext filterContext) 
    { 
     if(filterContext.Exception is HttpRequestValidationException) 
     { 
      filterContext.Result = new RedirectResult("/Error"); 
      filterContext.ExceptionHandled = true; 
     } 
    } 
} 

你可以在異常的Message一些更多的信息,如:

從客戶端(FILTERNAME =」 <腳本>檢測到有潛在危險的值的Request.QueryString警報(「!!」)< ...「)。

但是,這不是真的要顯示給用戶的東西。所以最好的做法是重定向到一些通用的錯誤頁面。或者您可以將它們發回當前頁面。

+0

是否有任何向模型狀態添加錯誤的方法,以便我可以將此錯誤重新發送給用戶?但是我會讓錯誤消息更通用。 – tbonejenkins

+0

那麼,在這個異常過濾器中,我們已經不在控制器中了。所以我不這麼認爲。如果您能夠替換引發錯誤的組件,也許可以將該錯誤添加到模型狀態中。 – juunas

+0

或者,如果在引發錯誤之前運行篩選器,您可以使用內部使用的相同組件驗證它,模型狀態錯誤並擦除模型中的值,從而不會引發錯誤。但如果它在模型綁定期間被拋出,那麼這將不起作用。 – juunas

0

剛纔我正在做一些快速測試,出於某種原因,當驗證異常發生時,動作過濾器和異常過濾器沒有得到執行 - 所以我使用Application_Error()快速提取了一些東西。 (您可以在Global.asax.cs創建這個方法,如果它不存在)

protected void Application_Error() 
{ 
    var lastError = Server.GetLastError() as HttpRequestValidationException; 
    if (lastError == null) 
     return; 

    MvcHandler mvcHandler = Context.CurrentHandler as MvcHandler; 
    if (mvcHandler == null) 
     return; 

    RequestContext requestContext = mvcHandler.RequestContext; 
    if (requestContext == null) 
     return; 

    Server.ClearError(); 
    Response.Clear(); 
    Response.TrySkipIisCustomErrors = true; 

    // pick one of the following two options, or maybe more? 
    RedirectToUrl(requestContext); 
    ExecuteActionResult(requestContext, ...); 

} 

void ExecuteActionResult(RequestContext requestContext, ActionResult result) 
{ 
    string controllerName = requestContext.RouteData.GetRequiredString("controller"); 
    IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory(); 
    IController controller = factory.CreateController(requestContext, controllerName); 
    ControllerContext controllerContext = new ControllerContext(requestContext, (ControllerBase)controller); 
    result.ExecuteResult(controllerContext); 
} 

void RedirectToUrl(RequestContext requestContext) 
{ 
    requestContext.HttpContext.Server.TransferRequest($"~/Error/Something", false); 
} 

我包括如何重定向到任意URL的例子,也是如何對同一控制器執行新的ActionResult爲例原始請求已被執行。