Session绑定CSRF防护真的有效吗?我这样写对不对?

爱学习的兰兰 阅读 42

我在用 Express + EJS 做一个简单的表单提交功能,听说把 CSRF token 和 Session 绑定能防攻击,但我照着文档写了还是有点懵——后端生成的 token 存到 session 里,前端再塞进 hidden input,这样就安全了吗?

我试了下面这段代码,但不确定是不是漏了什么关键步骤,比如 token 校验逻辑或者随机性够不够……

<form method="POST" action="/submit">
  <input type="hidden" name="_csrf" value="<%= session.csrfToken %>" />
  <input type="text" name="title" />
  <button type="submit">提交</button>
</form>

后端我是用 csurf 中间件生成 token 并挂到 session 上的,但总觉得这样直接从 session 读出来放页面上,会不会被别人伪造请求时照样带上?求指点!

我来解答 赞 2 收藏
二维码
手机扫码查看
1 条解答
迷人的颖杰
你这样做基本是对的,但缺了关键的后端验证步骤。csurf中间件默认会帮你验证,但最好自己确认下。给你个完整例子:

// 后端设置
const csrf = require('csurf');
const csrfProtection = csrf({ cookie: true });
app.use(csrfProtection);

// 路由里传token给前端
app.get('/form', (req, res) => {
res.render('form', {
csrfToken: req.csrfToken() // 会自动存session
});
});

// 提交时验证
app.post('/submit', csrfProtection, (req, res) => {
// 能执行到这里说明token验证通过了
console.log('安全的数据:', req.body);
});


前端部分你写的没问题,但要确保每个表单都有token。几个关键点:

1. token必须每次请求重新生成(csurf已经帮你做了)
2. 必须用POST/PUT/DELETE等会修改数据的请求方法
3. 别把token存在cookie里,要放session

常见漏掉的是忘记加csrfProtection中间件到POST路由,或者前端没在每个表单加token字段。你现在的代码改一下post路由就行。

伪造请求的问题是:攻击者拿不到你session里的token值,所以他们生成的假请求里token对不上。这就是为什么要把token和session绑定。
点赞
2026-03-05 13:01