我已经编写了一个应用程序,可以优雅地处理大多数异常,页面的设计完好无损并且出现错误信息。我的应用程序会在Page_Error
事件中捕获所有内容,并将例外添加到HttpContext.Curent.Context.Items
,然后将Server.Transfer
添加到Error.aspx
页面。我发现这是ASP.NET中唯一可行的解决方案,因为似乎没有其他方法可以集中和通用的方式来实现。
我还处理Application_Error
并在那里对发生的异常进行了一些检查,以确定我是否可以优雅地处理它。我发现我可以优雅地处理的例外情况是在有人攻击URI以包含.NET框架认为危险或在文件系统级别基本上非法的字符之后抛出的。
这样的URI看起来像是......:
http://exmample.com/"illegal"
http://example.com/illegal"/
http://example.com/illegal /
(注意最后一个URI末尾斜杠前面的空格)。
我希望这些URI以“404 Not Found”和友好消息进行响应,并且不会导致发送任何错误报告以避免DDOS攻击向量等。但是,我没有找到一种优雅的方法来捕捉这些类型的错误。我现在要做的是检查exception.TargetSite.Name
属性,如果它等于CheckInvalidPathChars
,ValidatePath
或CheckSuspiciousPhysicalPath
,我认为它是“路径验证异常”并以404。
有没有人知道如何处理这种不那么硬编码且更具前瞻性的方式?
PS:我在我的应用程序中使用System.Web.Routing
来获得干净且合理的URI,如果这对任何给定的解决方案都很重要。
答案 0 :(得分:3)
可能是System.Web.Routing支持某种类型的URL过滤,但实现自己很容易。
查看System.Web.IHttpModule界面并阅读implementing custom HTTP Modules。 Http模块进入Asp.Net管道并在页面运行之前运行。您可以使用它来执行请求记录,修改请求以及在您的情况下过滤请求。 Asp.Net路由模块也实现为自定义HTTP模块。
你可以做的是实现一个Http模块,它查看请求的url并检查它是否有效。如果网址无效,您可以执行任何操作,例如将其重定向到您的404 - 未找到的网页,或者您可以停止请求。
答案 1 :(得分:1)
我不认为使用System.Web.IHttpModule是IIS7 +的正确答案。我正在尝试实现IHttpModule来验证路径,但是在执行HttpModule之前抛出了异常。
这是我的异常堆栈:
[ArgumentException: Illegal characters in path.]
System.IO.Path.CheckInvalidPathChars(String path) +7493413
System.IO.Path.Combine(String path1, String path2) +40
System.Web.Configuration.UserMapPath.GetPhysicalPathForPath(String path, VirtualDirectoryMapping mapping) +114
System.Web.Configuration.UserMapPath.GetPathConfigFilename(String siteID, VirtualPath path, String& directory, String& baseName) +72
System.Web.Configuration.UserMapPath.MapPath(String siteID, VirtualPath path) +30
System.Web.Configuration.UserMapPath.MapPath(String siteID, String path) +31
System.Web.Hosting.HostingEnvironment.MapPathActual(VirtualPath virtualPath, Boolean permitNull) +297
System.Web.Hosting.HostingEnvironment.MapPathInternal(VirtualPath virtualPath, Boolean permitNull) +51
System.Web.CachedPathData.GetConfigPathData(String configPath) +341
System.Web.CachedPathData.GetVirtualPathData(VirtualPath virtualPath, Boolean permitPathsOutsideApp) +110
System.Web.HttpContext.GetFilePathData() +36
System.Web.HttpContext.GetConfigurationPathData() +26
System.Web.Configuration.RuntimeConfig.GetConfig(HttpContext context) +43
System.Web.Configuration.CustomErrorsSection.GetSettings(HttpContext context, Boolean canThrow) +41
System.Web.HttpResponse.ReportRuntimeError(Exception e, Boolean canThrow, Boolean localExecute) +101
System.Web.HttpRuntime.FinishRequest(HttpWorkerRequest wr, HttpContext context, Exception e) +383
这是IIS 7.0应用程序生命周期(http://msdn.microsoft.com/en-us/library/bb470252.aspx)
的链接我猜测“RESOLVE CACHE”步骤引起的异常
答案 2 :(得分:0)
编写自定义HttpModule对我不起作用 - 我仍然遇到“路径中的非法字符”错误,但this question的答案解决了问题:
事实证明,你可以通过在web.Config中为requestFiltering设置allowDoubleEscaping =“false”来避免这种情况。即:
<configuration>
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="false" />
</security>
</system.webServer>
</configuration>
也许不是完美的解决方案(对于更好的解决方案的任何建议都非常感激),但它解决了这个问题。