我一直在尝试通过 IIS 7 中的请求过滤工具来限制 URL 中的反斜杠 \,方法是:
<configuration>
<system.webServer>
<security>
<requestFiltering>
<denyUrlSequences>
<add sequence="\" />
</denyUrlSequences>
</requestFiltering>
</security>
</system.webServer>
</configuration>
但是,反斜杠规则被完全忽略了?请求过滤肯定有效,因为我尝试使用字符串代替反斜杠,例如contact-us
,拒绝规则正确地将您发送到 404 页面。但为什么它会忽略反斜杠?这里是不是缺少了什么?
感谢您的帮助
答案1
我最近研究了一个类似的问题,发现在将请求传递给 IIS 之前,HTTP.sys 会将反斜杠替换为正斜杠。因此,请求过滤模块永远没有机会阻止该请求,因为它看不到反斜杠。
更详细地说,我发送了以下请求
$ wget“http://www.example.com/awesome-category\awesome-products/”
--2012-08-22 12:51:31-- hhttp://www.example.com/awesome-category%5Cawesome-products/
正在解析 www.example.com... 192.168.1.77
正在连接到 www.example.com|192.168.1.77|:80... 已连接。HTTP
请求已发送,正在等待响应... 200 OK
长度:56398 (55K) [text/html]
保存到:`index.html'2012-08-22 12:51:38 (6.60 MB/s) - `index.html'
Wireshark 中出现以下内容:
4 0.001242000 192.168.200.42 192.168.100.177 HTTP 246 GET /awesome-category%5Cawesome-products/ HTTP/1.0
我还设置了HTTP.sys 事件跟踪查看 HTTP.sys 将请求传递给 IIS 和 .NET 之前发生的情况。
它显示 URL 中没有反斜杠:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Microsoft-Windows-HttpService" Guid="{dd5ef90a-6398-47a4-ad34-4dcecdef795f}" />
<EventID>2</EventID>
<Version>0</Version>
<Level>4</Level>
<Task>1</Task>
<Opcode>12</Opcode>
<Keywords>0x8000000000000002</Keywords>
<TimeCreated SystemTime="2012-08-22T11:51:29.179726800Z" />
<Correlation ActivityID="{80000663-0000-5d00-b63f-84710c7967bb}" />
<Execution ProcessID="4" ThreadID="1912" ProcessorID="0" KernelTime="8820" UserTime="0" />
<Channel>Microsoft-Windows-HttpService/Trace</Channel>
<Computer />
</System>
<EventData>
<Data Name="RequestObj">0xFFFFFA801C33B530</Data>
<Data Name="HttpVerb"> 4</Data>
<Data Name="Url">http://www.example.com.com:80/awesome-category/awesome-products</Data>
</EventData>
<RenderingInfo Culture="en-GB">
<Level>Information </Level>
<Opcode>Parse </Opcode>
<Keywords>
<Keyword>Flagged on all HTTP events dealing with request processing </Keyword>
</Keywords>
<Task>HTTP Request Trace Task </Task>
<Message>Parsed request (request pointer 0xFFFFFA801C33B530, method 4) with URI http://www.example.com.com:80/awesome-category/awesome-products. </Message>
<Channel>HTTP Service Channel </Channel>
<Provider>Microsoft-Windows-HttpService </Provider>
</RenderingInfo>
</Event>
据我所知,HTTP.sys 正在将 URL 中的反斜杠替换为正斜杠,以净化 URL 中的反斜杠。此行为已在 IIS 6 中记录这里:
当使用目录遍历时,规范化会有所不同。例如,收到以下请求:
http://www.example.com/RootTest/SubDir1\子目录2/../../子目录5/子目录6
Http.sys 将此 URL 规范化为以下 URL:
http://www.example.com/RootTest/SubDir5/SubDir6
注意:反斜杠改为正斜杠。”。
最近也有人提到这里:
发送到 IIS/WAS 的 URI 中的任何“\”(反斜杠)都会自动转换为“/”(正斜杠)。如果添加了包含“\”的相对地址,并且您向 IIS 发送了使用该相对地址的 URI,则反斜杠会转换为正斜杠,并且 IIS 无法将其与相对地址匹配。IIS 会发送跟踪信息,指示未找到匹配项。
我在另一台服务器上遇到了同样的情况,所以我怀疑没有办法使用请求过滤来实现这一点,这与 iis.net 上的一些文档不同。如果能从 MS 的某个人那里得到更清晰的确认就好了,但我什么也没找到。
编辑:以上内容有些过时、不完整或不准确。请参阅这个答案有关重写包含反斜杠的 URL 的示例。