安全 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 等攻击。 Expires和Max-Age-
Cookie 应在其不再需要时立即过期。特别是会话标识符应尽快过期。
Expires:为给定 Cookie 设置绝对过期日期。Max-Age:为给定 Cookie 设置相对过期日期。注意:
Expires比Max-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。
Set-Cookie: MOZSESSIONID=980e5da39d4b472b9f504cac9; Path=/; Secure; HttpOnly
使用 __Secure- 前缀为所有 example.org 站点设置会话标识符,有效期设置为 30 天。此 Cookie 不会跨域发送,但在从另一个站点导航到任何站点时会发送。
Set-Cookie: __Secure-MOZSESSIONID=7307d70a86bd4ab5a00499762; Max-Age=2592000; Domain=example.org; Path=/; Secure; HttpOnly; SameSite=Lax
在用户接受服务条款时,为当前主机设置一个长期有效的 Cookie,并且可以被 JavaScript 访问。此 Cookie 在从另一个站点导航到您的网站时发送,例如通过点击链接。
Set-Cookie: __Host-ACCEPTEDTOS=true; Expires=Fri, 31 Dec 9999 23:59:59 GMT; Path=/; Secure; SameSite=Lax
为安全(HTTPS)站点使用会话标识符。它不会从跨域请求发送,也不会在从另一个站点导航到您的站点时发送。当与其他反 CSRF 措施结合使用时,这为您的站点提供了针对 CSRF 攻击的非常强大的防御。
Set-Cookie: __Host-BMOSESSIONID=YnVnemlsbGE=; Max-Age=2592000; Path=/; Secure; HttpOnly; SameSite=Strict