在我的生产 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中的错误吗?