asp.net-mvc-3 - 具有有效 URL 的 ASP.NET MVC "Potentially dangerous Request.Path"

标签 asp.net-mvc-3 iis-7 requestfiltering

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

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

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

Request URL: http://www.somesite.com/Images/Image With Space.jpg

Request path: /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 的失败请求跟踪功能跟踪其中一个故障请求:

Referer: Google search

User-Agent: Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3

RequestURL: http://www.somesite.com:80/Images/Image%20With%20Space.jpg

在我的 iOS 5.1.1 中手动输入 URL 可以正确显示图像。在 Google 图片中搜索图像会正确显示该图像。仍然没有成功复制。

在我看到的痕迹的一半处:

MODULE_SET_RESPONSE_ERROR_STATUS Warning. ModuleName="RequestFilteringModule", Notification="BEGIN_REQUEST", HttpStatus="404", HttpReason="Not Found", HttpSubStatus="11",

根据 IIS 文档,请求过滤模块中的 404.11 是 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="&lt;,&gt;,*,%,:,&amp;,\" />

如您所见,% 符号被视为无效。空格可以编码为 %20,从而导致验证错误。您只需将 requestPathInvalidCharacters 属性添加到 Web.Config 文件中的 httpRuntime 部分,然后复制下面列出的值(“%,”部分除外)。

Scott Hanselman 有一篇关于此问题的博客文章:

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

关于asp.net-mvc-3 - 具有有效 URL 的 ASP.NET MVC "Potentially dangerous Request.Path",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10593277/

相关文章:

c# - ASP.NET 学习路径

javascript - 从 JavaScript 值分配模型属性值

asp.net - "Could not load file or assembly ' X.dll ' or one of its dependencies. The specified module could not be found."- 在主机服务器上

asp.net-mvc-3 - 如何删除不需要的 WWW-Authenticate header

iis - HTTP 错误 404.7 - 未找到请求过滤模块配置为拒绝文件扩展名

authorization - Quarkus 自定义授权拦截器

asp.net - 上传时文件大小超过默认大小

jquery - 在 asp.net mvc3 中使用 jquery unobtrusive 显示元素下方的验证消息

ASP.NET 应用程序使用大量内存 - 泄漏?

asp.net - RequestFiltering 不适用于 MS-DOS 设备名称路径