怎样正确实现双提交Cookie来防御CS Dev · 含平 提问于 2026-01-25 02:55:33 阅读 18 安全 最近在学习用Double Submit Cookie方法来增强网站的安全性,防止CSRF攻击。但是,在实际操作过程中遇到了些问题。 我的做法是在用户登录时生成一个随机token存储于cookie中,并且也把这个token作为隐藏字段加入到所有表单里。然后服务器端检查这两个值是否一致。 但我在测试这个流程时发现有时候服务器无法正确验证这俩值,导致即使正常的请求也被拒绝了。请问这是什么原因造成的? 另外,这样的实现方式有没有什么潜在的安全漏洞或者不好的地方? 我来解答 赞 4 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 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'); } 回复 点赞 2 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'); } // 继续处理请求... }); 这样写更清晰,也避免了一些常见坑。希望对你有帮助! 回复 点赞 11 2026-01-31 08:04 加载更多 相关推荐 2 回答 74 浏览 Double Submit Cookie如何防止CSRF攻击?我的实现总出现跨域问题怎么办? 我按照教程实现了双重提交Cookie,后端设置了CSRF-TOKEN到Cookie和响应头,前端在请求头带上这个Token。但测试时发现,跨域请求时浏览器报“Blocked cookie with s... シ莉莉 安全 2026-02-03 20:16:34 2 回答 70 浏览 CSRF Token验证时,表单提交的Token和Cookie里的不一致怎么办? 我在用CSRF Token防护登录表单,后端每次响应头都带了Set-Cookie: csrfToken=xxx,前端用JavaScript读取cookie里的值,然后塞到表单的隐藏字段里: docum... 小艳苹 安全 2026-01-29 05:05:32 1 回答 41 浏览 为什么我的Double Submit Cookie防CSRF方案在登录接口失效? 我在用Double Submit Cookie防CSRF时遇到奇怪的问题:其他接口都正常,但登录接口总提示"CSRF Token mismatch"。我检查了cookie设置和请求头,代码看起来没问题... UP主~红瑞 安全 2026-02-13 17:15:27 2 回答 67 浏览 前端POST请求被漏洞扫描工具标记CSRF漏洞,但后端已加防伪cookie该怎么办? 我在开发登录功能时,前端用axios发送POST请求,后端已通过nginx设置了Csrf-Token cookie且验证了请求头中的token。但最近漏洞扫描工具提示"缺少CSRF防护",明明后端已经... 爱学习的欢欢 安全 2026-01-28 22:49:30 1 回答 28 浏览 CSRF防护中,为什么我的前端生成的Token无法被后端正确验证? 我按照教程给表单请求加了CSRF防护,前端用UUID生成token存到cookie和隐藏字段里,但后端验证时总提示不匹配。明明都按文档做了,但验证还是失败,哪里出问题了? 前端代码这样写的: // 生... 令狐采涵 安全 2026-02-08 23:07:32 2 回答 78 浏览 为什么我的Anti-CSRF Token在跨域请求时失效了? 我在单页应用里用JWT做Anti-CSRF防护,每次登录后把token存在cookie并带上自定义请求头。但调用支付接口时后端返回403,明明请求头里带了正确的token值。 尝试过在Express后... 百里玲玲 安全 2026-02-01 08:29:30 2 回答 63 浏览 React表单提交时Anti-CSRF Token没变化导致重复提交被拦截怎么办? 我在用React做文件上传功能时,按照教程实现了CSRF防护,但发现同一个页面多次提交时token没变,导致第二次提交被服务器拦截了。明明在组件挂载时生成了token,代码是这样的: class Fi... 设计师景岩 安全 2026-01-31 16:56:29 2 回答 32 浏览 Double Submit Cookie设置后服务端无法验证,哪里出问题了? 我在用Double Submit Cookie防护CSRF时遇到问题,设置了cookie和请求头,但服务端一直提示验证失败。前端代码是这样的: document.cookie = `csrftoken... UX-子怡 安全 2026-01-31 12:13:26 2 回答 22 浏览 Double Submit Cookie的token怎么传到请求头里? 我按照文档做了Double Submit Cookie防护,但测试时发现后端收不到CSRF-TOKEN的请求头,只能拿到cookie里的值。这是为什么啊? 我的登录表单这样写的: document.c... 长孙一然 安全 2026-01-28 20:01:29 1 回答 12 浏览 React表单提交如何防止CSRF攻击?隐藏字段没生效? 在React项目里做订单取消功能,用隐藏字段传CSRF令牌,但提交时后端返回403错误。代码是这样写的: function CancelOrderForm() { const [csrfToken, ... 书圻 ☘︎ 安全 2026-02-15 19:30:29
domain和path属性,确保它们在请求时能正确匹配。另外,有时候浏览器的行为也会带来麻烦,比如用户清理了Cookies或者有多个子域名共享同一个Token,这些都会导致验证失败。所以最好在生成Token的时候加上一些额外的标识,比如用户的ID或者会话信息,这样可以更精确地匹配。
至于安全性方面,你的实现方式总体上是对的,但有几点需要注意:
1. Token一定要足够随机,建议用加密安全的随机数生成器。
2. 不要将Token直接暴露在URL中,只通过POST表单传递。
3. 如果可以用HTTPS,一定要启用,不然Cookie在传输过程中可能会被截获。
最后,给你一个简单的优化版逻辑,供参考:
这样写更清晰,也避免了一些常见坑。希望对你有帮助!