本文介紹 IIS(Internet Information Services)中兩個關鍵的 Cookie 安全設定:httpOnlyCookies 和 requireSSL,說明各自的作用與 web.config 寫法。
問題背景
最近,專案在進行弱點掃描時發現了一個與 ASP.NET_SessionId 有關的弱點。掃描結果顯示,這個重要的 Session ID 缺少必要的安全 Flag。因此,我決定仔細研究 IIS 中 Cookie 的安全設定,特別是 httpOnlyCookies 和 requireSSL 這兩個選項。
httpOnlyCookies
什麼是 httpOnlyCookies?
httpOnlyCookies 是一個安全特性,用於防止客戶端腳本存取受保護的 cookie。當啟用此選項時,cookie 只能透過 HTTP(S) 協議傳輸,而不能被客戶端腳本(如 JavaScript)存取。
為什麼重要?
啟用 httpOnlyCookies 可以顯著降低跨站腳本(XSS)攻擊的風險。攻擊者即使成功注入惡意腳本,也無法直接讀取或操作受保護的 cookie,從而保護了敏感資訊,如 Session ID。
在web.config中的配置:
1 | <configuration> |
requireSSL
什麼是 requireSSL?
requireSSL 是一個安全設置,讓 ASP.NET 在送出 Set-Cookie 回應標頭時自動加上 Secure 旗標。瀏覽器收到帶有 Secure 旗標的 cookie 之後,只會在 HTTPS 連線下才回傳該 cookie,HTTP 明文連線則完全不送出。弱點掃描報告常見的「Secure flag missing」警告,正是靠這個設定來修補。
為什麼重要?
啟用 requireSSL 可以防止中間人攻擊和 cookie 劫持。一旦加上 Secure 旗標,包含 Session ID 等敏感資訊的 cookie 就不會出現在明文的 HTTP 流量裡,大幅降低網路側錄竊取的風險。
實務注意:若 web.config 同時有
<forms>表單驗證設定,<httpCookies requireSSL="true">並不會自動覆蓋 forms 的 cookie 行為——需要在<forms>元素上也加requireSSL="true",否則表單驗證的 cookie 仍不會帶 Secure 旗標。另外,在純 HTTP 的開發或測試環境下啟用此設定,會導致登入後 cookie 無法正常傳遞,造成 Session 失效。
在web.config中的配置:
1 | <configuration> |
最佳實踐
- 生產環境始終啟用 httpOnlyCookies 和 requireSSL。
- 全站走 HTTPS,特別是涉及敏感資料的頁面。若有
<forms>表單驗證設定,需在<forms>元素上也加requireSSL="true",否則表單驗證的 cookie 不會帶 Secure 旗標。
結論
正確設定 httpOnlyCookies 和 requireSSL 可以防止常見的 XSS 與連線劫持攻擊,保護 Session ID 等敏感資料。需要注意的是,httpOnlyCookies 會讓 JavaScript 完全讀不到受保護的 cookie,若業務上確實需要前端腳本讀取某個 cookie(例如 CSRF token 的傳遞方式),應將該 cookie 排除在 HttpOnly 保護範圍之外,而非整站停用此設定。




