我正在使用模块https://www.npmjs.com/package/csurf保护我的公共路线,以防跨站点请求伪造。服务器和客户端托管在两个不同的域上,因此我无法使用直接方式将生成的令牌传递给客户端。
我现在在服务器上创建了两个不同的终结点,/ csrfToken在头中发送生成的令牌和csrf cookie,如果正确,路由/ register必须验证给定的令牌和csrf cookie。
const csrfProtection = csrf({
cookie: {
maxAge: 900
}
})
router.get('/csrfToken', csrfProtection, async (req, res, next) => {
res.json({ token: req.csrfToken() });
});
router.post(
'/register',
csrfProtection,
async (req, res, next) => {
return res.send('user registered');
}
);
我现在面临的问题是,端点/ csrfToken对所有公共请求都是开放的,每个人都可以向它发出请求。因此,有没有办法我可以在不将凭证暴露给客户端的情况下获得令牌?
我正在使用nuxt / vue,如果那与解决我的问题有关。
由于您将令牌公开为JSON,因此大概是使用Ajax发出这些请求。
只需确保您的Access-Control-Allow-Origin
标头仅允许您的网站从中读取数据。
然后,尽管任何人都可以通过非Ajax HTTP客户端向端点发出请求,但由于他们的令牌与用户Cookie中的令牌不匹配,因此它无法使用它进行CSRF攻击。] >