如何捕获 "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 以获取有关错误处理的更多详细信息。
我在 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 以获取有关错误处理的更多详细信息。