1. 网站存在 XSS 漏洞
这种验证方式的前提是"攻击者能发起请求(利用 Cookie),但看不到 Cookie 内容"。但如果网站存在 XSS(跨站脚本)漏洞,攻击者可以注入任意 JavaScript 代码。
- 获取 Cookie:攻击者可以通过
document.cookie直接读取到 Cookie 中的随机字符串。 - 构造请求:既然拿到了原始值,攻击者就能用 JS 发起请求,自动在 URL 参数里带上正确的字符串。此时,服务器收到的 Cookie 和参数完全匹配,验证会被通过。
- 本质:双重 Cookie 只能防御跨站请求(攻击者无法读取目标站点的 Cookie),但防不住本站内的恶意代码(XSS)。一旦存在 XSS,这个防御就形同虚设。
2. 不能做到子域名的隔离
这跟 Cookie 的 Domain 属性有关。
- 为了防止登录态丢失,主域(如
example.com)在设置 Cookie 时,通常会把Domain设为.example.com(带点)。 - 这意味着
a.example.com和b.example.com都能读写这个 Cookie。 - 风险:如果攻击者在
a.example.com上找到了一个子域名接管漏洞或XSS漏洞,他就能利用这个子域名篡改或读取用于主域的 Cookie,从而绕过验证。你无法严格限制这个 Cookie 只属于某个具体的子域名,导致安全边界被打破。
总结
- 简单来说,双重 Cookie 验证是一种便捷但安全等级有限的防御措施。它在防"跨站"方面很轻量,但完全依赖"没有 XSS"和"子域名完全可信"这两个前提。
- 在现代安全要求较高的场景下,通常更推荐使用 Samesite=Lax 配合 CSRF Token 的组合方案。