5月30日 21:29
双重提交 Cookie 如何防护 CSRF?实现时要注意什么?
双重提交 Cookie 防护 CSRF 的核心是:服务端生成随机 token,同时让浏览器把它放在 Cookie 里,并要求前端在表单字段或请求头里再提交一份。真正的同站页面能读到这份非 HttpOnly 的 CSRF Cookie,所以能把 token 放进请求;恶意站点虽然能诱导浏览器自动带上 Cookie,却读不到目标站 Cookie,也就很难提交同一份 token。服务端比较两边是否一致,就能拦住大多数跨站伪造请求。
追问
它和传统 CSRF Token 有什么区别?
传统 Token 通常保存在服务端 Session 里,请求来了拿提交值和 Session 值比对。双重提交 Cookie 不存服务端状态,更适合分布式和无状态接口,但要更小心 XSS、子域名和 Cookie 覆盖问题。
Cookie 能不能设置 HttpOnly?
普通双重提交模式下不能,因为前端需要读取 Cookie 后放进请求头或表单字段。更安全的变体是签名双重提交,避免攻击者伪造结构正确的 token。
为什么不建议把 token 放 URL?
URL 会进入浏览器历史、代理日志、服务端访问日志和第三方统计系统。Token 更适合放请求头或 POST body。
最容易踩什么坑?
Domain 配太宽,任意子域问题都可能影响主站;只判断字符串相等,没有处理缺失、长度不等和异常输入,也会留下边界问题。
写段代码
jsres.cookie('csrf_token', token, { httpOnly:false, secure:true, sameSite:'lax', path:'/' }); if (req.cookies.csrf_token !== req.get('x-csrf-token')) return res.sendStatus(403);