文件目錄有這樣一個包含了加號的文件:2015年日歷表(A4+版).pdf
現在要求下載此文件,考慮這樣一個url /UploadFile/2015年日歷表(A4+版).pdf
如果在瀏覽器訪問這個url,有時候會出現404.11的錯誤
HTTP Error 404.11 - Not Found
請求篩選模塊被配置為拒絕包含雙重轉義序列的請求
這是什么原因呢?
在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效果是一樣的,解碼后,都代表了空格
但是+號作為Url component(注意不是作為queryString)時,就是+號本身,不會轉義
例如 http://www.cnblogs.com/imust+2008/p/6829927.html
URL-Normalization: Full (url規范化對空格的編碼)
1,什么是雙重轉義序列
雙重轉義字符 (例如,"abc\\d") 對於url,+先轉義為space(空格),空格再轉義為%20
三個轉義字符 (例如,abc\\\d)
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錯誤。
3,
關閉 double-encoded requests filter
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true"/>
</security>
</system.webServer>