CSRF攻击不依赖窃取Cookie,而是利用浏览器自动发送Cookie的机制冒用用户身份;HttpOnly防XSS但对CSRF无效;SameSite=Lax在后台场景防护不足,需叠加CSRF Token、Origin校验等服务端措施。

因为 CSRF 攻击不依赖“读取” Cookie,只依赖浏览器“自动发送” Cookie。
CSRF 的本质是借用用户身份,不是窃取凭证
HttpOnly 确实让 JavaScript 无法通过 document.cookie 拿到 Token,但这对 CSRF 毫无影响。攻击者根本不需要知道 Cookie 的值——只要用户已登录,浏览器在向目标域名发起请求时,就会自动附上对应 Cookie。哪怕值是加密的、随机的、带签名的,只要它存在且匹配域,请求就成立。
这就像银行只验公章不验人:攻击者不偷章,只是让你在不知情时盖章。
HttpOnly 解决的是 XSS,不是 CSRF
HttpOnly 是为阻断 XSS 场景下脚本盗 Cookie 而设。它和 CSRF 属于不同攻击维度:
- XSS:攻击者注入脚本 → 读取敏感数据(如 Token)→ 外泄或冒用
- CSRF:攻击者诱导用户点击/跳转 → 浏览器自动发请求 → 带上已有 Cookie → 服务端误认为合法操作
前者防“看”,后者防“用”。HttpOnly 只管前者,不管后者。
SameSite=Lax 也不够用,尤其在后台管理场景
很多团队以为开了 SameSite=Lax 就高枕无忧,但 Lax 允许顶级导航(比如点击链接跳转)携带 Cookie。而攻击者只需构造一个伪装页面,内含一个按钮触发 fetch('/api/admin/delete', { method: 'POST', credentials: 'include' }),浏览器照样带上 Cookie 发送请求。
关键点在于:服务端如果只校验 Cookie 是否有效、不验证请求来源(Origin/Referer)、不校验 CSRF Token、也不区分 GET/POST 敏感操作,那 Lax 就形同虚设。
真正有效的 CSRF 防御手段
不能只靠 Cookie 属性,必须叠加服务端控制:
- 对写操作(POST/PUT/PATCH/DELETE)强制校验 CSRF Token,并绑定用户 Session
- 校验请求头中的
Origin或Referer,拒绝非法来源 - 敏感接口改用
SameSite=Strict(注意兼容性与用户体验权衡) - 关键操作增加二次确认(如短信/邮箱验证码),不依赖纯前端流程


















