安全 Cookie 配置

儘可能限制對 Cookie 的訪問。

問題

Cookie 通常包含會話識別符號或其他敏感資訊。因此,未經授權訪問 Cookie 會導致一系列問題,包括 隱私問題、(跨站指令碼 (XSS))攻擊、跨站請求偽造(CSRF)攻擊等。

解決方案

為最大程度地減小您網站上 Cookie 漏洞的範圍,請儘可能限制對 Cookie 的訪問。這可以透過明智地使用 Set-Cookie 標頭的以下指令來完成:

名稱

Cookie 名稱應加上 __Secure-__Host- 字首,以防止 Cookie 被不安全來源覆蓋。

  • 對於僅在特定域(不包括子域)上需要且 Path 設定為 / 的所有 Cookie,請使用 __Host-
  • 對於從安全源(HTTPS)傳送的所有其他 Cookie,請使用 __Secure-
安全

所有 Cookie 都必須設定 Secure 指令,表明它們只能透過 HTTPS 傳送。HTTP 嚴格傳輸安全 (HSTS) 也可用於防止透過 HTTP 傳輸,但理想情況下 Secure 也應設定在 Cookie 上。

HttpOnly

不需要 JavaScript 訪問的 Cookie 應設定 HttpOnly 指令以阻止訪問,例如透過 Document.cookie。對於會話識別符號,尤其重要的是不要讓 JavaScript 訪問,以幫助防止 CSRF 等攻擊。

ExpiresMax-Age

Cookie 應在其不再需要時立即過期。特別是會話識別符號應儘快過期。

  • Expires:為給定 Cookie 設定絕對過期日期。
  • Max-Age:為給定 Cookie 設定相對過期日期。

    注意: ExpiresMax-Age 可用時間更長;然而,Max-Age 更不容易出錯,並且在兩者都設定時具有優先權。其背後的原理是,當您設定 Expires 日期和時間時,它們是相對於設定 Cookie 的客戶端而言的。如果伺服器設定的時間不同,可能會導致錯誤。

僅當 Cookie 需要被其他域訪問時,才應設定 Domain;應將其設定為儘可能受限的域。

路徑

Cookie 應設定為儘可能受限的 Path

SameSite

使用 SameSite 禁止透過跨域請求(例如來自 <img> 元素的請求)傳送 Cookie。您應該使用以下兩個值之一:

  • SameSite=Strict:僅在同站上下文中(導航和其他請求)傳送 Cookie。在跨站請求(例如,嵌入來自其他網站的圖片或其他資源)和跨站導航(例如,當從另一個網頁點選連結時)中會省略 Cookie。這是一個非常嚴格的設定,但它提供了強大的 CSRF 保護,所以如果可能,請使用此值。
  • SameSite=Lax:在同站請求以及導航您的網站時傳送 Cookie。如果 Strict 太嚴格,應使用此選項。

以上兩個值在保護使用者已認證的場景免受 點選劫持 攻擊方面都很有用。

注意: 理論上,SameSite=Strict 的實際用途比它看起來要大。它經常會破壞導航——例如,使用者點選一個他們已登入的網站的連結(即,設定了有效的會話 Cookie),但由於瀏覽器故意省略了會話 Cookie,他們會顯示為未登入。最好的折衷方法是僅在 CSRF 是一個問題的令牌上使用 SameSite=Strict,或者在所有地方都使用 SameSite=Strict,但當有跡象表明使用者已登入但所需的 Cookie 未傳送時,重新載入頁面並在 JavaScript 中進行 Cookie 檢查。

示例

設定一個僅在當前主機上可訪問,並在使用者關閉瀏覽器時過期的會話識別符號 Cookie。

http
Set-Cookie: MOZSESSIONID=980e5da39d4b472b9f504cac9; Path=/; Secure; HttpOnly

使用 __Secure- 字首為所有 example.org 站點設定會話識別符號,有效期設定為 30 天。此 Cookie 不會跨域傳送,但在從另一個站點導航到任何站點時會發送。

http
Set-Cookie: __Secure-MOZSESSIONID=7307d70a86bd4ab5a00499762; Max-Age=2592000; Domain=example.org; Path=/; Secure; HttpOnly; SameSite=Lax

在使用者接受服務條款時,為當前主機設定一個長期有效的 Cookie,並且可以被 JavaScript 訪問。此 Cookie 在從另一個站點導航到您的網站時傳送,例如透過點選連結。

http
Set-Cookie: __Host-ACCEPTEDTOS=true; Expires=Fri, 31 Dec 9999 23:59:59 GMT; Path=/; Secure; SameSite=Lax

為安全(HTTPS)站點使用會話識別符號。它不會從跨域請求傳送,也不會在從另一個站點導航到您的站點時傳送。當與其他反 CSRF 措施結合使用時,這為您的站點提供了針對 CSRF 攻擊的非常強大的防禦。

http
Set-Cookie: __Host-BMOSESSIONID=YnVnemlsbGE=; Max-Age=2592000; Path=/; Secure; HttpOnly; SameSite=Strict

另見