Windows Server 2008 安裝 IIS 7 後,ASP 應用程式驗證碼 (CAPTCHA) 圖片無法顯示,經排查為 IIS 7 預設關閉「啟用父路徑」導致相對路徑引用失敗。
問題現象
- ASP 頁面正常開啟,但 `
` 或 `Server.MapPath("../include/config.asp")` 類相對路徑資源 404/顯示紅叉。
- 錯誤日誌:`Active Server Pages, ASP 0131 (0x80004005) Disallowed Parent Path`。
根因分析
IIS 6/7/7.5/8/8.5/10 預設 `enableParentPaths = false` 為安全考量,防止目錄遍歷攻擊。傳統 ASP 應用大量使用 `../` 相對路徑引用共用元件,需明確啟用。
解決步驟 (IIS 7 管理主控台)
- 開啟「Internet Information Services (IIS) 管理員」 (inetmgr)。
- 左側連線樹狀展開:伺服器名稱 → 「網站」→ 目標網站 (如「Default Web Site」)。
- 中間功能檢視雙擊「ASP」圖示 (若無,需「角色服務」安裝「ASP」)。
- 「ASP」設定頁 → 「行為」區段 → 「啟用父路徑」 → 將 `False` 改為 `True`。
- 右側「動作」面板 → 「套用」。
- 回收應用程式集區:左側「應用程式集區」→ 目標集區 → 右鍵「回收」。
替代方案:web.config 設定 (適用共用主機/無管理員權限)
在網站根目錄 `web.config` 中加入:
<configuration>
<system.webServer>
<asp enableParentPaths="true" />
</system.webServer>
</configuration>
需確認伺服器層級 `applicationHost.config` 未鎖定 `` 區段 (`overrideModeDefault="Allow"`)。
安全性考量與緩解措施
- 啟用父路徑後,惡意 ASP 可透過 `../../` 讀取系統敏感檔案 (web.config, global.asa, 資料庫連線字串)。
- ✅ 緩解:
① 應用程式集區身分識別使用專用低權限帳戶 (非 NetworkService/LocalSystem)。
② NTFS 權限:網站根目錄僅授予該帳戶「讀取/寫入/執行」,上層目錄拒絕存取。
③ 部署 URL Rewrite 規則封鎖 `..` 路徑存取非應用目錄。
④ 規劃遷移至 ASP.NET Core / PHP / Node.js 現代架構,棄用傳統 ASP。
驗證修復
- 瀏覽器開啟驗證碼頁面 → 圖片正常顯示。
- F12 開發者工具 → Network 確認 captcha 回應 200 OK、Content-Type: image/jpeg (或 gif/png)。
- 功能測試:輸入驗證碼送出表單 → 伺服端驗證通過。
補充:IIS 7 角色安裝關鍵點
- 「伺服器管理員」→「角色」→「新增角色」→「Web 伺服器 (IIS)」。
- 「角色服務」務必勾選:「ASP」、「ISAPI 延伸模組」、「ISAPI 篩選器」、「CGI」、「伺服器端包含 (SSI)」。
- 安裝完成後,「管理工具」→「Internet Information Services (IIS) 管理員」即可管理。