前言
最近系統被 AppScan 掃出「偵測到隱藏目錄」的問題,在 IIS 上,如果目錄不存在,就會回 404 ,而如果目錄存在,又不允許瀏覽,就會回 403。 所以就可以透過回傳的狀態碼來判斷目錄的存在與否。 那要怎麼解決呢?
研究與解法
先建立一個 IIS 的應用程式,裡面建立一個 admin 的目錄,並在 admin 目錄中,新增一個 hi.htm 的檔案,然後來測試。
如果目錄不存在,IIS 會回 404 ,例如在 Browser 上輸入 http://localhost/t/doc 就會出 404 的錯誤,如下,
如果目錄存在,就會回 403.14 Forbidden,例如在 Browser 上輸入 http://localhost/t/admin 就會出現 403 的錯誤,如下,
我們可以參考「Configure IIS to return 404 for directory browse attempts」中的幾種建議,
設定 Request Filtering 中的 Hidden Segments
情境:如果該目錄像 App_Code 這樣子的目錄,只是系統使用,Client 完全不能用,這樣子設定,如下,
但如果您目錄中有頁面是要給 Client 使用的,就不能用這種方式哦!
設定預設的 default.htm ,並設定檔案屬性為 Hidden
情境:如果您要卡的目錄只有一個,就還好,但如果目錄很多的話,就不建議這樣子做。
設定 web.config 的方式,將 403 導到 page not found 的頁面
所以我們可以在應用程式目錄(t)下放一個 pagenotfound.htm ,當遇到 403.14 時,就導到那一頁去,如下,
1 |
|
當然,原本的 404 也是要到一樣的頁面去,才不會讓 403 與 404 有區別,所以當我在 browser 輸入 http://localhost/t/doc 及 http://localhost/t/admin 都會被導到 /t/pagenotfound.htm ,如下圖,
但是眼尖的朋友會可以發現,為什麼打 /doc 跟 /admin 它的網路錄下來不一樣呢?
輸入 /doc 時,會連到 /doc (302) => /t/pagenotfound.htm (200) ,
輸入 /admin 時,會連到 /admin (301) /admin/ (302) => /t/pagenotfound.htm (200) ,
但是如果輸入 /admin/ 時,行為就會跟 /doc 一樣, /admin/ (302) => /t/pagenotfound.htm (200) 。
為什麼會這樣子呢? 這個是「courtesy redirect」,就是說,如果你在網址後面不是 / 結尾的話,它會檢查 目錄 是否存在,如果存在的話,就會回 301 請 Browser 去連結尾有 / 的網址,這也就是為什麼如果目錄真的存在,輸入 /admin 會多一個 301 。
如果要避免這個問題,就需要「停用預設網頁」功能 (
1 | <?xml version="1.0" encoding="UTF-8"?> |
參考資料
Configure IIS to return 404 for directory browse attempts
Solving the tyranny of HTTP 403 responses to directory browsing in ASP.NET
HttpErros 與 CustomErrors 的自訂導向
Can’t change IIS response code with URL Rewrite outbound rule