csurf :我们如何将 csrf 令牌传递给客户端而不将其插入到模板视图中?

Nic*_*eda 1 security cookies csrf express

我没有使用像把手或视图这样的模板语言(我捆绑了客户端代码),所以我很难弄清楚如何在不将其传递到视图的情况下发送 csrf 令牌。

几乎所有示例都像这样注入令牌服务器端:

app.get('/form', csrfProtection, function(req, res) {
  // pass the csrfToken to the view
  res.render('send', { csrfToken: req.csrfToken() })
})
Run Code Online (Sandbox Code Playgroud)

我不完全确定注入是否是安全机制正常工作所必需的。

注意:我将 cookie 选项设置为 true,并且在 csurf 之前调用了 cookie 解析器 - 但我仍然收到ForbiddenError: invalid csrf 令牌(我相信这是因为我将 _csrf 秘密作为令牌发回,但我猜它发送秘密,_csrf,我们还必须连同它一起发送 csrf 令牌。

题:

是否有其他可接受的方式将 csrf 令牌发送到客户端(例如 headers、cookies、res.body 等)?

Joe*_*ias 6

您可以使用 cookie。确保在路由之前定义以下代码。像这样做:

app.use((req, res, next)=> {

  var token = req.csrfToken();
  res.cookie('XSRF-TOKEN', token);
  res.locals.csrfToken = token;

  next();
});

app.post('/someroute', (req, resp)=>{

//..processing something...

})
Run Code Online (Sandbox Code Playgroud)

这就是为什么你会在你的客户端有一个带有生成的令牌的 cookie。此令牌将针对每个请求进行更新。要将此令牌添加到 ajax 请求,您只需读取 cookie 并将令牌传递给请求。例如使用 axios:

axios.defaults.headers.common['x-csrf-token'] = readCookie('XSRF-TOKEN');
axios.post('/someroute', {somedata}) 
Run Code Online (Sandbox Code Playgroud)