2017-11-17 175 views
2

在Azure Cloud Service上运行的我的MVC 5 Web应用程序崩溃,出现未处理的异常“从客户端(:)”检测到潜在危险的Request.Path值。如何捕获“从客户端(:)”检测到潜在危险的Request.Path值以避免Web角色崩溃?

原因此崩溃是一些第三方(可能恶意)打我的终点与网址: http://myExampleHost.com/m:443/templates

在URL中的冒号不能通过路径验证。

一些答案(A potentially dangerous Request.Path value was detected from the client (*))建议更改验证规则。但是,出于安全考虑,我们可能不想妥协。

理想的行为是这样的:我们捕获异常,记录并返回一些错误信息而不会崩溃。我们应该怎么做?

对此的一个更一般的问题是:如何在请求命中MVC控制器之前捕获异常?

回答

2

理想的行为是这样的:我们捕获异常,记录并返回一些错误信息而不会崩溃。我们应该怎么做?

根据我的理解,您可以利用Application_Error事件捕获ASP.NET中未处理的异常。这里是我的测试,你可以参考一下吧:

protected void Application_Error() 
{ 
    HttpContext httpContext = HttpContext.Current; 
    var exception=Server.GetLastError(); 
    var httpException = exception as HttpException ?? new HttpException(500, "Internal Server Error", exception); 
    var jsonResponse = new 
    { 
     Message = exception.Message, 
     StatusCode = httpException.GetHttpCode(), 
     StackTrace=httpException.StackTrace 
    }; 
    httpContext.Response.ContentType = "application/json"; 
    httpContext.Response.ContentEncoding = Encoding.UTF8; 
    httpContext.Response.Write(JsonConvert.SerializeObject(jsonResponse)); 
    httpContext.Response.End(); 
} 

enter image description here

注:你也可以重定向到一个特定的错误页面。

此外,您可以利用web.config中的customErrors并捕获特定HTTP错误代码的错误页面。此外,您可以检查Application_EndRequest事件下的HTTP状态代码并编写自定义响应,详细信息可参考此类似的issue。此外,我建议您按照Demystifying ASP.NET MVC 5 Error Pages and Error Logging获取有关错误处理的更多详细信息。

+0

我喜欢你所做的,因为我们通过将错误发送给自己并向用户显示一个通用错误来做类似的事情。我们怎样才能专门捕捉到这个错误?我们最近发现,我们需要专门为某些其他函数捕获'HttpRequestValidationException',并且希望找到一种专门捕获此错误的方法。 – RoLYroLLs

相关问题