安全 Cookie 配置
尽可能限制对 Cookie 的访问。
问题
Cookie 通常包含会话标识符或其他敏感信息。因此,未经授权访问 Cookie 会导致一系列问题,包括隐私问题、(跨站脚本 (XSS)) 攻击、跨站请求伪造 (CSRF) 攻击等等。
解决方案
为了最大程度地减少网站上 Cookie 漏洞的范围,请尽可能限制对 Cookie 的访问。这可以通过合理使用 Set-Cookie
标头的以下指令来实现
名称
-
Cookie 名称应以
__Secure-
或__Host-
开头,以防止 Cookie 被不安全来源覆盖。- 对于仅在特定域(无子域)上需要的 Cookie,其中
Path
设置为/
,请使用__Host-
。 - 对于从安全来源 (HTTPS) 发送的所有其他 Cookie,请使用
__Secure-
。
- 对于仅在特定域(无子域)上需要的 Cookie,其中
安全
-
所有 Cookie 必须使用
Secure
指令设置,指示它们只能通过 HTTPS 发送。HTTP 严格传输安全 (HSTS) 也可用于防止通过 HTTP 传输,但理想情况下,也应在 Cookie 上设置Secure
。 HttpOnly
-
不需要 JavaScript 访问的 Cookie 应设置
HttpOnly
指令以阻止访问,例如来自Document.cookie
的访问。会话标识符尤其不能有 JavaScript 访问权限,以帮助防止 CSRF 等攻击。 Expires
和Max-Age
-
Cookie 应在不再需要时过期。特别是会话标识符应尽快过期。除非需要支持 IE < 8,否则首选
Expires
,否则使用Max-Age
。Expires
:为给定的 Cookie 设置绝对过期日期。Max-Age
:为给定的 Cookie 设置相对过期日期。注意:
Expires
比Max-Age
出现的时间更长;但是,Max-Age
误差更小,并且在两者都设置时优先。这样做的原因是,当您设置Expires
日期和时间时,它们相对于设置 Cookie 的客户端。如果服务器设置为不同的时间,则可能会导致错误。
域
-
Cookie 仅在需要在其他域上访问时才应设置
Domain
;这应设置为尽可能严格的域。 路径
-
Cookie 应设置为尽可能严格的
Path
。 SameSite
-
使用
SameSite
禁止通过跨源请求(例如来自<img>
元素)发送 Cookie。您应该使用以下两个值之一SameSite=Strict
:仅在同站点上下文中(导航和其他请求)发送 Cookie。在同源上下文中(例如,从a.example.com
导航到b.example.com
)、跨站点请求(例如,热链接)和跨站点导航(例如,在从不同网页关注链接时)中省略 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,该 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