以 %20 结尾的 URL 存在问题

Posted

技术标签:

【中文标题】以 %20 结尾的 URL 存在问题【英文标题】:Problem with a URL that ends with %20 【发布时间】:2010-11-10 17:39:16 【问题描述】:

我有一个大问题。现场有设备发送 URL“/updates”。这是这些设备的开发人员的错字。在服务器日志中,它看起来像“/updates+”。

我有一个 ManageURL 重写模块,可以处理所有请求而无需扩展。但是这个请求会导致 HttpException:

System.Web.HttpException:

System.Web.HttpException
   at System.Web.Util.FileUtil.CheckSuspiciousPhysicalPath(String physicalPath)
   at System.Web.HttpContext.ValidatePath()
   at System.Web.HttpApplication.ValidatePathExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

正如我在日志中看到的,URL 重写模块甚至没有得到这个 URL,所以我无法在那里修复它。

有没有办法用 ASP.NET 处理这些 URL?

【问题讨论】:

我们需要查看生成异常的代码。 您是在使用 IIS 重写模块还是您自己编写的模块来进行重写? 【参考方案1】:

如果您可以访问代码,为什么不检查末尾的“+”并将其删除?

【讨论】:

【参考方案2】:

根据some,这是在System.Web.dll

internal static void CheckSuspiciousPhysicalPath(string physicalPath)

  if (((physicalPath != null) && (physicalPath.Length > 0))
    && (Path.GetFullPath(physicalPath) != physicalPath))
  
    throw new HttpException(0x194, "");
  

我猜你不能改变它,但不能在 IIS 设置中禁用它吗?当然,这也会禁用所有其他检查... :-(

或者编写一些在上述代码之前运行的 ISAPI 过滤器?根据Handle URI hacking gracefully in ASP.NET 所说,编写自己的模块很容易。

或者,create your own error page。在此页面(如上面的 URI hacking 链接中建议的那样)在exception.TargetSite.Name 中搜索特定文本,例如CheckSuspiciousPhysicalPath,如果找到(或总是)查看current.Request.RawUrl 或类似内容,清除错误并重定向到修复后的 URL?

【讨论】:

谢谢。抱歉这么久没有回答。作为临时修复,我们创建了一个 404 页面。并找到一种在设备上进行更改的方法。无论如何,这个错误促使我找到一个可以处理这些问题的 ISAPI 模块。 欢迎回来 ;-) 实际上,我猜 Cheeso 关于使用 ISAPI 重写过滤器的回答可能是一个简单的解决方法。然后希望在执行上述代码之前运行 —— 但我认为 Cheeso 是该过滤器的作者,我相信作者最了解。 Cheeso 的答案只有我一个赞成票,所以:你读过那个答案了吗? @AlfeG:只是为了回答 “我猜你无法改变” >> 你实际上可以,通过注册PreSendRequestHeaders。查看我新添加的答案,或查看***.com/questions/429963/… (很好,@Abel。另请参阅How do comment @replies work?AlfeG 没有收到您的评论通知,但会收到您的新答案通知,所以现在没问题。) (啊,我明白了。所以在这种情况下,只使用@AlfeG会警告他,指定多个用户不会。Tx解释)【参考方案3】:

您可以运行 URL 重写 ISAPI,例如 IIRF。

【讨论】:

IIRF 不是我们应用的理想解决方案。我正在等待 2.0 版本的发布。 IIRF 2.0 已经发布并可用,但不是最终版本。但是在 IIRF v2.0 的重写引擎中没有什么是您在 IIRF v1.2.16 中无法获得的。 就像我在我自己的答案的 cmets 中所写:我假设 IIRF 在 IIS 中的任何内置安全性之前运行?因此,在处理对 IIS 的控制之前,可以完全重写任何 URL(或者:只是去除错误的尾随空格),因此在调用 CheckSuspiciousPhysicalPath 之前。正确的?对我来说似乎是一个很好的解决方案,但仍然是我的唯一赞成票。我错过了这里的重点吗? @Arjan,不,我认为您没有错过重点。您是正确的,ISAPI 过滤器将在 System.Web.dll 检查可疑路径之前运行。我对 IIRF v2.0 的评论是针对 AlfeG,他说他正在等待 v2.0。我想说,出于重写目的,等待是没有意义的。 IIRF v1.2 或 v2.0 都将实现目标。 跟我想的完全一样。 (我确实明白你在回复 AlfeG,但我只是不明白为什么 AlfeG 认为 IIRF 不是一个简单的解决方案,即使只是删除一个空格......毕竟不是一个大问题?)【参考方案4】:

好的,这是一个旧线程,但我想添加一个适用于所有 ASP.NET 版本的可行解决方案。看看this answer in a related thread。它基本上归结为在global.asax.cs 中注册事件PreSendRequestHeaders

或者,在 ASP.NET 4.0 或更高版本上,在 web.config 中使用 <httpRuntime relaxedUrlToFileSystemMapping="true" />

【讨论】:

以上是关于以 %20 结尾的 URL 存在问题的主要内容,如果未能解决你的问题,请参考以下文章

如何检查一个值是不是已经存在以避免重复?

重定向规则以允许 html 页面存在于目录 url

在 Oracle 中制作唯一的 slug url

旧网站存在安全问题如何处理?

wchar 以单个或两个空字节结尾?

如果 URL 已存在于数据库中,如何使用 PHP 检查?