網友回報,部落格的標籤(Tag)分類查詢,遇到標籤包含空白(例如:Kendo UI、Windows 8…)會出現HTTP 404.11錯誤:
錯誤訊息已提供明確指示,有幾個關鍵字,allowDoubleEscaping、RequestFilteringModule,推測IIS是基於某些資安考慮封鎖了路徑出現+的URL,調整allowDoubleEscaping設定即可排除。所以,把閞關打開就沒事了嗎?
不,這不是我的風格,IIS之所以會加入新限制一定有理由,移除前應審慎考慮其風險(遇到資安就變龜毛是我的傳統,例如:多想兩分鐘,你可以不必教User關掉Vista UAC 、多想兩分鐘,你可以不用 validateRequest=-false),這回,或許也該「多想兩分鐘,你可以不要打開allowDoubleEscaping」。
URL參數(Query String)編碼時空白會轉成+是常識,在過去URL路徑也採納相同的規則(CGI時代的標準),但依據新的HTTP規範,URL路徑的空白應轉為%20,只有URL參數的空白才應該轉成+。
+
means a space only in application/x-www-form-urlencoded
content, such as the query part of a URL: http://www.example.com/path/foo+bar/path?query+name=query+value
In this URL, the parameter name is query name
with a space and the value is query value
with a space, but the folder name in the path is literally foo+bar
, notfoo bar
. 參考
而這也是為什麼JavaScript不建議再用esacpe(),改用encodeURI()或encodeURIComponent()的理由。延伸閱讀:encodeURI / encodeURIComponent的使用時機
問題來了,部落格平台程式萬年沒改過(羞愧),標籤查詢URL何以一夕出錯?我想起,由於Windows 2003平台支援中止在即,Hosting廠商最近將網站搬到Windows 2012R2上,IIS從IIS 6升級到IIS 8.5,二者對URL把關標準不同,開始出錯。
IIS Team Blog的這篇文章用一個實例解釋了什麼為IIS要禁止URL路徑使用加號:
<authorization vdir="my vdir">
<allowed users="Administrators"/>
</authorization>
若允許URL將+轉成空白,則httq://the-web-server/my+vdir/可以存取"my vdir"路徑,卻不受權限設定規範。簡單來說,這項額外轉碼規則易形成URL樣式比對上的漏洞或增加比對複雜度,當比對與安全控管有關,就會帶來風險。
認同這樣的安全考慮,乖乖地修改程式,在產生URL路徑時,用%20取代+, 問題排除。
PS:感謝網友Alex Tam通報網站錯誤。