严重程度:高危Cookie 安全
Secure、HttpOnly 和 SameSite cookie 标志
会话 cookie 是重点攻击目标。Secure、HttpOnly 和 SameSite 这三个属性决定了攻击者能否窃取或滥用它们。缺失这些标志会直接导致会话劫持和 CSRF。
这是什么
Secure 只让 cookie 通过 HTTPS 发送。HttpOnly 让它对 JavaScript(document.cookie)不可见。SameSite 控制它是否随跨站请求一起发送。
三者结合能缩小攻击面:攻击者无法通过注入的脚本读取 cookie,无法在 HTTP 上嗅探它,也无法从另一个网站借用它。
为什么重要
没有 HttpOnly,任何 XSS 漏洞都能读取会话 cookie,把一个已登录的会话拱手交给攻击者。没有 Secure,cookie 会在任何明文 HTTP 请求中泄露。
没有 SameSite,浏览器会把 cookie 附加到跨站请求上,而这正是 CSRF 攻击所依赖的机制。
如何修复
给会话 cookie 同时设置这三个标志
大多数框架在你设置 cookie 时都会以选项的形式暴露这些设置。
res.cookie("session", token, {
secure: true,
httpOnly: true,
sameSite: "lax", // or "strict" for maximum protection
path: "/",
}); 使用 cookie 名称前缀
把 cookie 命名为 __Host- 开头,会强制浏览器要求 Secure、Path=/ 且不带 Domain——这是会话 cookie 一个强健、自我约束的基线。
记住 SameSite=None 需要 Secure
如果你确实需要跨站 cookie,SameSite=None 只有在同时设置了 Secure 时才会生效;否则现代浏览器会丢弃该 cookie。
常见问题
SameSite 用 Lax 还是 Strict?
Lax 是一个安全的默认值,仍允许顶层导航。Strict 更严格,但可能破坏那些用户从外部链接进入却期望已登录的流程。
这些标志能阻止 XSS 吗?
HttpOnly 通过隐藏 cookie 来限制 XSS 造成的损害,但它并不能阻止 XSS。请搭配一个强健的 Content-Security-Policy。