本文介紹 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
2
3
4
5
<configuration>
<system.web>
<httpCookies httpOnlyCookies="true" />
</system.web>
</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
2
3
4
5
<configuration>
<system.web>
<httpCookies requireSSL="true" />
</system.web>
</configuration>

最佳實踐

  1. 生產環境始終啟用 httpOnlyCookies 和 requireSSL。
  2. 全站走 HTTPS,特別是涉及敏感資料的頁面。若有 <forms> 表單驗證設定,需在 <forms> 元素上也加 requireSSL="true",否則表單驗證的 cookie 不會帶 Secure 旗標。

結論

正確設定 httpOnlyCookies 和 requireSSL 可以防止常見的 XSS 與連線劫持攻擊,保護 Session ID 等敏感資料。需要注意的是,httpOnlyCookies 會讓 JavaScript 完全讀不到受保護的 cookie,若業務上確實需要前端腳本讀取某個 cookie(例如 CSRF token 的傳遞方式),應將該 cookie 排除在 HttpOnly 保護範圍之外,而非整站停用此設定。