怎样正确实现双提交Cookie来防御CS Dev · 含平 提问于 2026-01-25 02:55:33 阅读 43 安全 最近在学习用Double Submit Cookie方法来增强网站的安全性,防止CSRF攻击。但是,在实际操作过程中遇到了些问题。 我的做法是在用户登录时生成一个随机token存储于cookie中,并且也把这个token作为隐藏字段加入到所有表单里。然后服务器端检查这两个值是否一致。 但我在测试这个流程时发现有时候服务器无法正确验证这俩值,导致即使正常的请求也被拒绝了。请问这是什么原因造成的? 另外,这样的实现方式有没有什么潜在的安全漏洞或者不好的地方? 我来解答 赞 7 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 南海弄竹 Lv1 你生成的 token 没有在服务端持久化存储,导致每次请求的 token 校验失败。正确做法是将 token 存在 session 或数据库中,而不是只放在 cookie 和表单里。 // 示例:服务端生成并保存 token const token = crypto.randomBytes(16).toString('hex'); res.cookie('csrf_token', token, { httpOnly: false }); req.session.csrf_token = token; // 存入 session // 校验时从 session 取出比对 if (req.body.csrf_token !== req.session.csrf_token) { return res.status(403).send('CSRF token mismatch'); } 回复 点赞 10 2026-02-03 11:09 Mc.夏沫 Lv1 嗯,这个问题挺常见的。你遇到的问题可能是因为Cookie的域或路径设置不对,导致服务器端拿到的Cookie值和表单提交的那个Token不一致。建议检查一下Cookie的domain和path属性,确保它们在请求时能正确匹配。 另外,有时候浏览器的行为也会带来麻烦,比如用户清理了Cookies或者有多个子域名共享同一个Token,这些都会导致验证失败。所以最好在生成Token的时候加上一些额外的标识,比如用户的ID或者会话信息,这样可以更精确地匹配。 至于安全性方面,你的实现方式总体上是对的,但有几点需要注意: 1. Token一定要足够随机,建议用加密安全的随机数生成器。 2. 不要将Token直接暴露在URL中,只通过POST表单传递。 3. 如果可以用HTTPS,一定要启用,不然Cookie在传输过程中可能会被截获。 最后,给你一个简单的优化版逻辑,供参考: // 生成Token时 const csrfToken = crypto.randomBytes(16).toString('hex'); res.cookie('csrfToken', csrfToken, { httpOnly: true, secure: true }); // 表单处理时 app.post('/submit', (req, res) => { const cookieToken = req.cookies.csrfToken; const formToken = req.body.csrfToken; if (!cookieToken || !formToken || cookieToken !== formToken) { return res.status(403).send('CSRF verification failed'); } // 继续处理请求... }); 这样写更清晰,也避免了一些常见坑。希望对你有帮助! 回复 点赞 19 2026-01-31 08:04 加载更多 相关推荐 2 回答 95 浏览 Double Submit Cookie如何防止CSRF攻击?我的实现总出现跨域问题怎么办? 我按照教程实现了双重提交Cookie,后端设置了CSRF-TOKEN到Cookie和响应头,前端在请求头带上这个Token。但测试时发现,跨域请求时浏览器报“Blocked cookie with s... シ莉莉 安全 2026-02-03 20:16:34 1 回答 29 浏览 Double Submit Cookie 防 CSRF 到底怎么实现才安全? 我最近在项目里尝试用 Double Submit Cookie 方案防 CSRF,后端把 token 放在 Set-Cookie 里,前端再从 cookie 读出来塞到请求头。但我不确定这样是不是真的... Dev · 玉淇 安全 2026-03-23 19:29:25 2 回答 91 浏览 CSRF Token验证时,表单提交的Token和Cookie里的不一致怎么办? 我在用CSRF Token防护登录表单,后端每次响应头都带了Set-Cookie: csrfToken=xxx,前端用JavaScript读取cookie里的值,然后塞到表单的隐藏字段里: docum... 小艳苹 安全 2026-01-29 05:05:32 1 回答 32 浏览 设置 SameSite=Strict 的 Cookie 后,Vue 前端还能正常发送 CSRF Token 吗? 我在后端设置了带 SameSite=Strict 的 CSRF Cookie,但前端用 Vue 发请求时好像拿不到这个 Cookie,导致 CSRF Token 传不上去。我试过在 axios 请求里... 小志远 安全 2026-03-31 01:22:16 2 回答 80 浏览 为什么我的Double Submit Cookie防CSRF方案在登录接口失效? 我在用Double Submit Cookie防CSRF时遇到奇怪的问题:其他接口都正常,但登录接口总提示"CSRF Token mismatch"。我检查了cookie设置和请求头,代码看起来没问题... UP主~红瑞 安全 2026-02-13 17:15:27 2 回答 97 浏览 前端POST请求被漏洞扫描工具标记CSRF漏洞,但后端已加防伪cookie该怎么办? 我在开发登录功能时,前端用axios发送POST请求,后端已通过nginx设置了Csrf-Token cookie且验证了请求头中的token。但最近漏洞扫描工具提示"缺少CSRF防护",明明后端已经... 爱学习的欢欢 安全 2026-01-28 22:49:30 2 回答 76 浏览 CSRF防护中,为什么我的前端生成的Token无法被后端正确验证? 我按照教程给表单请求加了CSRF防护,前端用UUID生成token存到cookie和隐藏字段里,但后端验证时总提示不匹配。明明都按文档做了,但验证还是失败,哪里出问题了? 前端代码这样写的: // 生... 令狐采涵 安全 2026-02-08 23:07:32 1 回答 36 浏览 前端怎么安全地处理 CSRF Token? 我在做登录功能时,后端要求每次请求都要带 CSRF Token,但我把 token 存在 Cookie 里,又怕被 XSS 攻击偷走。试过用 HttpOnly 的 Cookie,但前端又读不到 tok... 旭来🍀 安全 2026-03-10 16:45:24 2 回答 32 浏览 HttpOnly 能防 CSRF 吗?我是不是搞混了概念? 最近在做登录功能,看到资料说要加 HttpOnly 防止 XSS 窃取 cookie,但我以为它也能防 CSRF,结果测试发现照样能被跨站请求伪造,是不是理解错了? 比如我后端设置了 Set-Cook... 欧阳雨萱 安全 2026-03-03 17:26:22 1 回答 48 浏览 前端如何配合后端做好CSRF防护?状态变更操作总被拦截怎么办? 我们项目里用的是 cookie + CSRF token 的方案,后端要求所有修改数据的请求(比如 POST、PUT)都必须带一个叫 X-CSRF-Token 的 header。但我发现每次提交表单时... 萌新.莉莉 安全 2026-02-27 17:53:20
domain和path属性,确保它们在请求时能正确匹配。另外,有时候浏览器的行为也会带来麻烦,比如用户清理了Cookies或者有多个子域名共享同一个Token,这些都会导致验证失败。所以最好在生成Token的时候加上一些额外的标识,比如用户的ID或者会话信息,这样可以更精确地匹配。
至于安全性方面,你的实现方式总体上是对的,但有几点需要注意:
1. Token一定要足够随机,建议用加密安全的随机数生成器。
2. 不要将Token直接暴露在URL中,只通过POST表单传递。
3. 如果可以用HTTPS,一定要启用,不然Cookie在传输过程中可能会被截获。
最后,给你一个简单的优化版逻辑,供参考:
这样写更清晰,也避免了一些常见坑。希望对你有帮助!