Asp.net mvc 3 “ASP.NET MVC”;潜在危险的请求。路径“;使用有效的URL

Asp.net mvc 3 “ASP.NET MVC”;潜在危险的请求。路径“;使用有效的URL,asp.net-mvc-3,iis-7,requestfiltering,Asp.net Mvc 3,Iis 7,Requestfiltering,在我的生产ASP.NET MVC 3站点上,我注意到Windows应用程序日志中偶尔出现“潜在危险的请求。从客户端检测到路径值(%)”。未处理的异常 虽然这些请求在正常的站点使用(ie/随机网络机器人)下是完全有效的,但许多请求似乎来自有效的本地ISP用户 在异常的请求详细信息中,请求URL与请求路径不同: 请求URL:With Space.jpg 请求路径:/Images/Imagehttp://www.somesite.com/Images/Image 使用Space.jpgWithhttp

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

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

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

请求URL:With Space.jpg

请求路径:/Images/Imagehttp://www.somesite.com/Images/Image 使用Space.jpgWithhttp://www.somesite.com/Images/Image 使用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

请求URL:

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

走到一半我看到:

模块设置响应错误状态警告。ModuleName=“RequestFilteringModule”,Notification=“开始请求”,HttpStatus=“404”,HttpReason=“未找到”,HttpSubStatus=“11”

根据IIS的文档,来自请求过滤模块的404.11是URL中的“双重编码”错误。经过一点实验,如果我故意创建一个双重编码的url,比如我在事件日志中得到了确切的错误,并完成了格式错误的请求路径

事件日志错误中格式错误的请求路径似乎是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有一篇关于此问题的博客文章:


我忍不住想,考虑到受限制的用户代理,这可能表示IOS 5.1.1上该浏览器对URL的处理不正确。我个人并不拥有这样的设备,所以我无法测试它——但是,研究一下它在url中的行为会很有趣,因为url中实际上有空格

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

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


相反,我认为如果你能证实这个“bug”(我已经在路上了,从苹果的律师那里找到了一个安全的藏身之处),找到一种适用于这个设备的格式;或者从资源URL中删除所有空格。
-
是最好的选择。

并且URL是有效的,MVC/IIS在不进行任何调整或修改的情况下处理它-这不是一个简单的请求验证问题。仔细查看上面错误中显示的请求路径。我个人永远不会允许服务器上存在带有空格的文件/页面。我总是用-。不幸的是,我不认为这是问题所在。如果我在浏览器中键入URL(包含%20个值),IIS和MVC将处理该请求并正确提供该请求,而无需禁用或更改默认请求验证。在我所有的测试中,URL都是有效的。仔细观察错误-出现了异常行为,在每个空间中都放置了一个URL副本。有趣的是,问题似乎是在请求到达ASP.NET 4.0之前发生的。如果我在调试器中放置断点,Request.Path不会显示任何百分比符号,并且包含一个带空格字符的完全解码的URL。当ASP.NET在URL中检测到%字符时,未处理的异常正在ASP.NET中发生。这意味着无论出于何种原因,IIS 7.0从一开始就对URL进行了错误解码或其格式不正确。事件日志中没有显示“真实”(原始)编码的URL。我在Safari对图像的请求中发现了同样的问题——它在url中编码了一个“?”,然后被视为路径的一部分,所以asp.net会发出“哇,有人试图通过在路径上打问号来攻击你!!”的呕吐声。将不得不重构以使用一个没有问号的url作为特定路径,我认为。。。