5

在我的生产 ASP.NET MVC 3 站点上,我注意到偶尔会出现“从客户端检测到潜在危险的 Request.Path 值 (%)”。Windows 应用程序日志中未处理的异常。

虽然这些在常规站点使用(即/随机网络机器人)下可能是完全有效的,但许多请求似乎来自有效的本地 ISP 用户。

在异常的请求详细信息中,请求 URL 与请求路径不同:

请求网址: http: //www.somesite.com/Images/Image With Space.jpg

请求路径:/Images/Imagehttp://www.somesite.com/Images/Image With Space.jpgWithhttp://www.somesite.com/Images/Image With Space.jpgSpace.jpg

请注意,在“请求路径”中,路径中任何有“空格”的地方都将替换为请求 url 的精确副本!

在站点内,实际链接如下所示:

<img src="/Images/Image%20With%20Space.jpg" />

知道可能是什么原因造成的吗?我试图查看 Request.Path 和 Request.Url 的文档,但我不知道为什么它们会有所不同。直接点击请求 URL 会正确调出资源。

更新:我设法通过使用 IIS 7.0 的失败请求跟踪功能来跟踪其中一个故障请求:

参考:谷歌搜索

用户代理:Mozilla/5.0(iPad;CPU OS 5_1_1,如 Mac OS X)AppleWebKit/534.46(KHTML,如 Gecko)版本/5.1 Mobile/9B206 Safari/7534.48.3

请求网址:http: //www.somesite.com :80/Images/Image%20With%20Space.jpg

在我的 iOS 5.1.1 中手动键入 URL 会正确显示图像。在 Google 图片中搜索图片会正确显示图片。仍然没有成功繁殖。

我看到的跟踪中途:

MODULE_SET_RESPONSE_ERROR_STATUS 警告。ModuleName="RequestFilteringModule", Notification="BEGIN_REQUEST", HttpStatus="404", HttpReason="Not Found", HttpSubStatus="11",

根据 IIS 的文档,来自请求过滤模块的 404.11 是 URL 中的“双重编码”错误。尝试一下,如果我故意创建一个双重编码的 url,例如http://www.somesite.com/Images/Image%2520With%2520Space.jpg我会在事件日志中得到确切的错误,并带有格式错误的请求路径。

事件日志错误中的格式错误的请求路径似乎是 ASP.NET 4.0 中的错误。

但是,它并没有解释为什么我首先会收到错误。我检查了大量失败的请求日志——唯一的共同因素是它们都在使用 AppleWebKit。这可能是Safari中的错误吗?

4

2 回答 2

1

我不禁想到——考虑到受限的用户代理——这可能表示该浏览器在 IOS 5.1.1 上对 URL 的处理不正确。我个人并不拥有这样的设备,因此我无法对此进行测试 - 但如果使用实际上包含空格的 url 来研究它的行为方式会很有趣。

我有一种感觉,它正在%20从页面源的 url 中看到并对其进行双重编码,认为它很有帮助。问题在于 IIS 会将其解码回来(在 ASP.net 启动之前)并将其从婴儿车中抛出,因为现在它看到的是文字%20而不是空格。

我个人不建议修改服务器的安全设置;然而,这将是最简单的解决方案,所以我敢说这就是你要做的。

相反,我认为如果你能确认这个“错误”(我已经在路上,正在寻找一个安全的藏身之处,不让 Apple 的律师发现),找到一种适用于该设备的格式;或从您的资源网址中取出所有空格。A-是最好的选择。

于 2012-07-16T15:33:50.747 回答
1

The httpRuntime section of the Web.Config can be modified to adjust the URL validation. ASP MVC projects are usually running in the validation mode 2.0 and the default invalid characters (separated by commas) are listed below.

<httpRuntime requestValidationMode="2.0" requestPathInvalidCharacters="&lt;,&gt;,*,%,:,&amp;,\" />

As you can see the % sign is considered invalid. A space can be encoded to %20 causing the validation error. You can just add the requestPathInvalidCharacters attribute to the httpRuntime section in your Web.Config file and copy the values I listed below except for the "%," part.

Scott Hanselman has a blog post about this issue:

http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx

于 2012-07-12T13:57:39.107 回答