Session绑定CSRF防护真的有效吗?我这样写对不对?
我在用 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 读出来放页面上,会不会被别人伪造请求时照样带上?求指点!
前端部分你写的没问题,但要确保每个表单都有token。几个关键点:
1. token必须每次请求重新生成(csurf已经帮你做了)
2. 必须用POST/PUT/DELETE等会修改数据的请求方法
3. 别把token存在cookie里,要放session
常见漏掉的是忘记加csrfProtection中间件到POST路由,或者前端没在每个表单加token字段。你现在的代码改一下post路由就行。
伪造请求的问题是:攻击者拿不到你session里的token值,所以他们生成的假请求里token对不上。这就是为什么要把token和session绑定。