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

5
我的MVC 5 Web应用程序在Azure Cloud Service上运行时崩溃,并出现了一个未处理的异常:“客户端检测到潜在危险的请求路径值(:)”。
导致这种崩溃的原因是某些第三方(可能是恶意的)使用以下url命中我的端点:http://myExampleHost.com/m:443/templates url中的冒号无法通过路径验证。
一些答案(A potentially dangerous Request.Path value was detected from the client (*))建议更改验证规则。但出于安全考虑,我们可能不想在此方面妥协。
理想情况是:我们捕获异常、记录它并返回一些错误消息而不会崩溃。我们该如何做?
更一般的问题是:如何在MVC中在请求到达控制器之前捕获异常?
1个回答

6
理想情况下,我们应该捕获异常、记录异常并返回一些错误信息而不是崩溃。那么我们该如何做呢?
据我所知,您可以利用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状态码并编写自定义响应,详细信息可以参考类似的问题。另外,我建议您阅读Demystifying ASP.NET MVC 5 Error Pages and Error Logging以获取更多有关错误处理的详细信息。


我喜欢你所做的事情,因为我们也通过向自己发送电子邮件并向用户显示通用错误来执行类似的操作。我们如何具体捕获此错误?最近,我们发现需要特别捕获 HttpRequestValidationException 以针对某些其他功能,我们想找到一种特别捕获此错误的方法。 - RoLYroLLs
如果 ErrorCode 是 E_FAIL/0x80004005/-2147467259 并且 StackTrace 包含 "ValidateInputIfRequiredByConfig",我会检测到此异常。我不仅仅检查消息,因为我担心它可能与语言有关。 - Etherman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接