我試圖處理好以下幾個問題處理,但此錯誤
的通知用戶有潛在危險的Request.Form值從客戶端檢測到'「是從檢測到有潛在危險的Request.Form值在 客戶」
不過,我不能找到一個很好的教程,介紹瞭如何抓住這個錯誤並處理它。只是爲了清楚,我想在填寫表單時阻止用戶輸入任何標記。處理此問題的大多數文章都提示關閉請求驗證。這不是我想要做的事情。我想捕捉錯誤並將錯誤回放給用戶。任何幫助將不勝感激。
我試圖處理好以下幾個問題處理,但此錯誤
的通知用戶有潛在危險的Request.Form值從客戶端檢測到'「是從檢測到有潛在危險的Request.Form值在 客戶」
不過,我不能找到一個很好的教程,介紹瞭如何抓住這個錯誤並處理它。只是爲了清楚,我想在填寫表單時阻止用戶輸入任何標記。處理此問題的大多數文章都提示關閉請求驗證。這不是我想要做的事情。我想捕捉錯誤並將錯誤回放給用戶。任何幫助將不勝感激。
您可以使用異常過濾器捕獲錯誤。喜歡的東西:
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警報(「!!」)< ...「)。
但是,這不是真的要顯示給用戶的東西。所以最好的做法是重定向到一些通用的錯誤頁面。或者您可以將它們發回當前頁面。
是否有任何向模型狀態添加錯誤的方法,以便我可以將此錯誤重新發送給用戶?但是我會讓錯誤消息更通用。 – tbonejenkins
那麼,在這個異常過濾器中,我們已經不在控制器中了。所以我不這麼認爲。如果您能夠替換引發錯誤的組件,也許可以將該錯誤添加到模型狀態中。 – juunas
或者,如果在引發錯誤之前運行篩選器,您可以使用內部使用的相同組件驗證它,模型狀態錯誤並擦除模型中的值,從而不會引發錯誤。但如果它在模型綁定期間被拋出,那麼這將不起作用。 – juunas
剛纔我正在做一些快速測試,出於某種原因,當驗證異常發生時,動作過濾器和異常過濾器沒有得到執行 - 所以我使用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
爲例原始請求已被執行。
也許這會容易的HTML,但只是從輸入值剝離任何標記? –
@TiesonT。有很多東西/各種攻擊被驗證過濾出來 - 認爲你可以做得比ASP.Net更好。 – caesay
@caesay我不是建議關閉請求驗證。我建議將AllowHtmlAttribute添加到OP正在使用的任何模型中,然後清理輸入。 –