在ASP.NET中优雅地处理URI攻击
我已经编写了一个应用程序,可以优雅地处理大多数异常,并且页面的设计完好无损,并且出现一个相当错误的消息。我的应用程序在Page_Error
事件中捕获了所有应用程序,然后将该例外添加到HttpContext.Curent.Context.Items
,然后将Server.Transfer
添加到Error.aspx
页面。我发现这是ASP.NET中唯一可行的解决方案,因为似乎没有其他方式以集中和通用的方式来完成此任务。在ASP.NET中优雅地处理URI攻击
我也处理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,如果这是任何给定的任何解决方案的重要性。
这可能是System.Web.Routing支持某种形式的URL过滤,但它是很容易实现自己的。
看那System.Web.IHttpModule接口和了解implementing custom HTTP Modules。 Http模块输入该Asp.Net管道并在您的页面运行之前运行。您可以使用它来执行请求的日志记录,修改请求并在您的情况下过滤请求。 Asp.Net路由模块也被实现为一个自定义的HTTP模块。
你可以做什么来实现的HTTP模块,着眼于所请求的URL,并检查其是否有效。如果url无效,你可以做任何你需要的,例如重定向到你的404 - 找不到的页面,或者你可以停止请求。
我不认为使用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)
是造成“解决CACHE”例外步
编写自定义的HttpModule并没有为我工作 - 我仍然得到了“非法字符的路径”错误,但回答this question解决了这个问题:
原来你可以通过在web.Config中的requestFiltering中设置allowDoubleEscaping =“false”来避免这种情况。即:
<configuration>
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="false" />
</security>
</system.webServer>
</configuration>
也许不是完美的解决方案(对于一个更好的任何建议,非常感谢),但它解决了这个问题。
我同意这将是最好的解决方案。如果您在问题真正发生之前处理问题,那么您将保存服务器资源。我也想在你的模块中添加,你应该将检查url函数附加到HttpApplication.BeginRequest事件中。 – regex 2009-02-27 14:55:45