我一直试图通过IIS 7中的请求过滤工具来限制URL中的反斜杠\:
<configuration> <system.webServer> <security> <requestFiltering> <denyUrlSequences> <add sequence="\" /> </denyUrlSequences> </requestFiltering> </security> </system.webServer> </configuration>
但是,反斜线规则正被完全忽略? 请求过滤肯定是工作,因为我已经尝试过使用string而不是反斜杠,例如contact-us作为拒绝规则正确地将您发送到404页面。 但为什么它忽略了反斜杠呢? 这里有什么缺失吗?
感谢您的帮助
我最近查看了一个类似的问题,发现在将请求交给IIS之前,反斜杠被HTTP.sys中的正斜杠replace。 所以,请求过滤模块将永远不会有机会阻止请求,因为它不会看到反斜杠。
更详细地说,我发送了以下请求
$ wget“ http://www.example.com/awesome-category \ awesome-products /”
– 2012-08-22 12:51:31 – http://www.example.com/awesome-category%5Cawesome-products/
正在parsingwww.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中的反斜杠用正斜杠replace它们。 此行为在此处为IIS 6logging:
当使用目录遍历时,规范化是不同的。 例如,收到以下请求:
http://www.example.com/RootTest/SubDir1 \ SubDir2 /../../ SubDir5 / SubDir6
Http.sys将此URL标准化为以下URL:
http://www.example.com/RootTest/SubDir5/SubDir6
注意:反斜杠被改为正斜杠。“
最近在这里也提到:
发送到IIS / WAS的URI中的任何“\”(反斜杠)将自动转换为“/”(正斜杠)。 如果添加了一个包含“\”的相对地址,并向IIS发送了使用相对地址的URI,则反斜杠将转换为正斜杠,而IIS无法将其与相对地址相匹配。 IIS发送跟踪信息,指示找不到匹配项。
我在另一台服务器上得到了相同的行为,所以我怀疑没有办法使用请求筛选来完成这个任务,与iis.net上的一些文档不同。 从MS的某个人那里得到更明确的确认真是太好了,但我找不到任何东西。
编辑:上面的一些是过时的,不完整的或不准确的。 有关重写包含反斜杠的URL的示例,请参阅此答案 。