文件目录有这样一个包含了加号的文件:2015年日历表(A4+版).pdf
现在要求下载此文件,考虑这样一个url /UploadFile/2015年日历表(A4+版).pdf
如果在浏览器访问这个url,有时候会出现404.11的错误
请求筛选模块 被配置为拒绝包含 双重转义序列 的请求
这是什么原因呢?
在window下,加号(+)是合法的文件名,但是在url里代表了不同的意思
参考 http://stackoverflow.com/questions/1005676/urls-and-plus-signs
若是作为queryString的一部分,那么+号代表空格
访问 https://www.baidu.com/?dd=ha+ha 和 https://www.baidu.com/?dd=ha%20ha 效果是一样的, 解码后,都代表了空格
2,IIS的Request Filtering机制
IIS7以及以上版本,集成了一个URLScan工具,用于扫描url,检测不安全的字符,此工具的Request Filtering模块用于过滤不安全的请求。
https://docs.microsoft.com/en-us/iis/manage/configuring-security/use-request-filtering
其中的double-encoded requests filter(双重转义过滤器),用于过滤双重转义序列。
当url出现双重转义序列时,IIS将对url进行两次url规范化(url normalization),当第一次规范化后的字符串与第二次规范化的字符串不一致时,IIS认为这是危险的url,IIS将拒绝这一请求,并返回404.11错误。
关闭 double-encoded requests filter
<system.webServer> <security> <requestFiltering allowDoubleEscaping="true"/> </security> </system.webServer>