如何捕获 "A potentially dangerous Request.Path value was detected from the client (:)" 以避免网络角色崩溃?

How to catch "A potentially dangerous Request.Path value was detected from the client (:)" to avoid web role crash?

我在 Azure 云服务上的 MVC 5 Web 应用程序 运行 因未处理的异常而崩溃 "A potentially dangerous Request.Path value was detected from the client (:)"。

这次崩溃的原因是某些第三方(可能是恶意的)使用 url 攻击了我的端点: http://myExampleHost.com/m:443/templates

url中的冒号无法通过路径验证。

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

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

一个更普遍的问题是:如何在请求到达 MVC 中的控制器之前捕获异常?

The ideal behavior for it that: we catch the exception, log it and return some error messages without crashing. How should we do that?

据我了解,您可以利用 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();
}

注意:您也可以重定向到特定的错误页面。

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