csurf :我们如何在不将 csrf 令牌插入模板视图的情况下将其传递给客户端?
csurf : How can we pass the csrf token to the client without inserting it into a template view?
我没有使用 handlebars 或 view 之类的模板语言(我捆绑了 client-side 代码),所以我很难弄清楚如何在不传递 csrf 令牌的情况下发送它进入视图。
几乎所有示例都像这样注入令牌 server-side:
app.get('/form', csrfProtection, function(req, res) {
// pass the csrfToken to the view
res.render('send', { csrfToken: req.csrfToken() })
})
我不完全确定注入是否是安全机制正常工作所必需的。
注意:我将 cookie 选项设置为 true,并且在 csurf 之前调用了 cookie 解析器 - 但我仍然得到 ForbiddenError: invalid csrf token(我相信发生这种情况是因为我将 _csrf 秘密作为令牌发回,但我猜它会发送秘密 _csrf,而且我们还必须将 csrf 令牌与其一起发送。
问题:
是否有其他可接受的方式将 csrf 令牌发送到客户端(例如 headers、cookies、res.body 等)?
您可以使用 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...
})
这样您的客户端就会有一个带有生成的令牌的 cookie。此令牌将针对每个请求进行更新。
要将此令牌添加到 ajax 请求,您只需读取 cookie 并将令牌传递给请求。例如使用 axios:
axios.defaults.headers.common['x-csrf-token'] = readCookie('XSRF-TOKEN');
axios.post('/someroute', {somedata})
我没有使用 handlebars 或 view 之类的模板语言(我捆绑了 client-side 代码),所以我很难弄清楚如何在不传递 csrf 令牌的情况下发送它进入视图。
几乎所有示例都像这样注入令牌 server-side:
app.get('/form', csrfProtection, function(req, res) {
// pass the csrfToken to the view
res.render('send', { csrfToken: req.csrfToken() })
})
我不完全确定注入是否是安全机制正常工作所必需的。
注意:我将 cookie 选项设置为 true,并且在 csurf 之前调用了 cookie 解析器 - 但我仍然得到 ForbiddenError: invalid csrf token(我相信发生这种情况是因为我将 _csrf 秘密作为令牌发回,但我猜它会发送秘密 _csrf,而且我们还必须将 csrf 令牌与其一起发送。
问题:
是否有其他可接受的方式将 csrf 令牌发送到客户端(例如 headers、cookies、res.body 等)?
您可以使用 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...
})
这样您的客户端就会有一个带有生成的令牌的 cookie。此令牌将针对每个请求进行更新。 要将此令牌添加到 ajax 请求,您只需读取 cookie 并将令牌传递给请求。例如使用 axios:
axios.defaults.headers.common['x-csrf-token'] = readCookie('XSRF-TOKEN');
axios.post('/someroute', {somedata})