怎样正确实现双提交Cookie来防御CS

Dev · 含平 阅读 18

最近在学习用Double Submit Cookie方法来增强网站的安全性,防止CSRF攻击。但是,在实际操作过程中遇到了些问题。

我的做法是在用户登录时生成一个随机token存储于cookie中,并且也把这个token作为隐藏字段加入到所有表单里。然后服务器端检查这两个值是否一致。

但我在测试这个流程时发现有时候服务器无法正确验证这俩值,导致即使正常的请求也被拒绝了。请问这是什么原因造成的?

另外,这样的实现方式有没有什么潜在的安全漏洞或者不好的地方?

我来解答 赞 4 收藏
二维码
手机扫码查看
2 条解答
南海弄竹
你生成的 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.夏沫
Mc.夏沫 Lv1
嗯,这个问题挺常见的。你遇到的问题可能是因为Cookie的域或路径设置不对,导致服务器端拿到的Cookie值和表单提交的那个Token不一致。建议检查一下Cookie的domainpath属性,确保它们在请求时能正确匹配。

另外,有时候浏览器的行为也会带来麻烦,比如用户清理了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