在使用csurf时,正常的表单都没有问题,但是如果是上传表单就会403,网上都搜过都没找到解决方案。 有同学遇到类似问题吗,或者有没有其他替代方案?
2 回复
你说的403是指 invalid csrf token 吗? 如果是,这表示表单提交的csrfToken和期望的csrfToken不匹配。
// check user-submitted value
if (!tokens.verify(secret, value(req))) {
var err = new Error('invalid csrf token');
err.status = 403;
next(err);
return;
}
Expressjs的csurf中间件缺省这样提取csrfToken:
function defaultValue(req) {
return (req.body && req.body._csrf) // POST _csrf字段
|| (req.query && req.query._csrf) // GET _csrf字段
|| (req.headers['x-csrf-token']) // 扩展的x-csrf-token或x-xsrf-token请求头
|| (req.headers['x-xsrf-token']);
}
比较怪异的是:即使表单的enctype设置为multipart/form-data, 也不会影响这些字段的提交。 如果还不能找到原因,估计可行的方法就是到node_modules/csurf/index.js中查看代码。