在ASP.NET中优雅地处理URI黑客攻击

时间:2009-02-27 09:23:07

标签: asp.net exception-handling error-handling uri

我已经编写了一个应用程序,可以优雅地处理大多数异常,页面的设计完好无损并且出现错误信息。我的应用程序会在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属性,如果它等于CheckInvalidPathCharsValidatePathCheckSuspiciousPhysicalPath,我认为它是“路径验证异常”并以404。

但是,这似乎是一个黑客攻击。首先,方法名称列表可能不会以任何方式完成,其次,这些方法名称可能会被替换或重命名,这将导致我的代码中断。

有没有人知道如何处理这种不那么硬编码且更具前瞻性的方式?

PS:我在我的应用程序中使用System.Web.Routing来获得干净且合理的URI,如果这对任何给定的解决方案都很重要。

3 个答案:

答案 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>

也许不是完美的解决方案(对于更好的解决方案的任何建议都非常感激),但它解决了这个问题。