Sha*_*ser 5 iis-7 asp.net-mvc-3 requestfiltering
在我的生产ASP.NET MVC 3站点上,我注意到偶尔会出现"从客户端检测到一个潜在危险的Request.Path值(%)".Windows应用程序日志中的未处理异常.
虽然这些在常规站点使用(即/随机web机器人)下完全有效,但许多请求似乎来自有效的本地ISP用户.
在例外的请求详细信息中,请求URL与请求路径不同:
请求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" />
Run Code Online (Sandbox Code Playgroud)
知道可能导致这种情况的原因吗?我试着查看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
RequestURL:http://www.somesite.com:80/Images/Image%20With%20Space.jpg
手动将URL键入我的iOS 5.1.1会正确显示图像.在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中的一个错误吗?
可以修改 Web.Config 的 httpRuntime 部分来调整 URL 验证。ASP MVC 项目通常运行在验证模式 2.0 下,下面列出了默认的无效字符(以逗号分隔)。
<httpRuntime requestValidationMode="2.0" requestPathInvalidCharacters="<,>,*,%,:,&,\" />
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,% 符号被认为是无效的。空格可以编码为 %20,从而导致验证错误。您只需将该requestPathInvalidCharacters属性添加到httpRuntimeWeb.Config 文件中的部分,然后复制下面列出的值(“%,”部分除外)。
Scott Hanselman 有一篇关于此问题的博客文章:
| 归档时间: |
|
| 查看次数: |
5052 次 |
| 最近记录: |