我有一个ASP.NET MVC应用程序,其路由允许通过/ search /< searchterm>搜索内容。
当我提供“search / abc”时效果很好,但是当我提供“/ search / a + b + c”(正确的url编码)时,IIS7拒绝HTTP错误404.11的请求(请求过滤模块配置为拒绝包含双转义序列的请求)。首先,它为什么这样做?它似乎只是抛出错误,如果它是URL的一部分,但不作为查询字符串的一部分(/ transmit?q = a + b + c工作正常)。
现在我可以在web.config的安全部分启用双转义请求,但是我不愿意这样做,因为我不明白其含义,也没有为什么服务器会拒绝请求“a + b + c“作为URL的一部分,但作为查询字符串的一部分接受。
有人可以解释并提供一些建议吗?
答案 0 :(得分:149)
编辑: 为相关部分增加了重点。
基本上:IIS过于偏执。如果您没有对uri解码数据执行任何特别不明智的操作(例如通过字符串连接生成本地文件系统URI),则可以安全地禁用此检查。
要禁用检查,请执行以下操作(来自here):(请参阅下面的评论,了解双重转义的含义)。
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true"/>
</security>
</system.webServer>
如果加号是搜索输入中的有效字符,则需要启用“allowDoubleEscaping”以允许IIS从URI的路径处理此类输入。
最后,一个非常简单的,如果有限的解决方法只是避免使用'+'并使用'%20'代替。 在任何情况下,使用“+”符号对空格进行编码不有效网址编码,但特定于一组有限的协议,并且可能广泛支持向后兼容原因。如果仅用于规范化目的,最好将空格编码为'%20'无论如何;这很好地回避了IIS7问题(它仍然可以用于其他序列,例如%25ab。)
答案 1 :(得分:2)
您是否考虑过将搜索网址设为'/ search / a / b / c'?
您需要设置类似
的路线search/{*path}
然后从操作中的路径字符串中提取搜索值。
HTHS
查尔斯
答案 2 :(得分:2)
我只想 添加 一些与{<3>要做的事情>部分相关的Eamon Nerbonne's answer信息(不解释为什么) 您也可以使用
轻松更改特定应用程序的设置输入以下内容(摘自此处:http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-containing.aspx):
%windir%\system32\inetsrv\appcmd set config "YOURSITENAME" -section:system.webServer/security/requestfiltering -allowDoubleEscaping:true
(例如,您可以将YOURSITENAME
替换为Default Web Site
,以将此规则应用于默认网站)
一个例子:
答案 3 :(得分:0)
我在IIS 7.5下遇到了在应用程序中执行Server.TransferRequest()的问题。
编码文件名会导致双重转义问题,但如果我没有编码,那么我会遇到"potentially dangerous Request.Path"错误。
在我传递给Server.TranferRequest()的URL上放置任何协议,甚至是空协议,解决了这个问题。
不起作用:
context.Server.TransferRequest("/application_name/folder/bar%20bar.jpg");
使用:
context.Server.TransferRequest("://folder/bar%20bar.jpg");