大家好,我的csrf保护有问题。
我正在使用express管理api服务,并为客户端做出反应。
因此,我安装了csruf软件包,然后执行了此操作:
var csrfProtection = csrf({ cookie: {httpOnly: true} });
app.use(csrfProtection);
app.use(function(req, res, next) {
res.locals._csrf = req.csrfToken();
next();
});
app.use(function (err, req, res, next) {
if (err.code !== 'EBADCSRFTOKEN') return next(err)
res.status(403);
return res.json({"status": "failure"});
});
该文件位于我的index.js(服务器端)中。
然后,我以这种方式注册一条路线:
app.use('/api/user/', users);
用户的定义依据:
const users = require('./routing/routes/User');
,在这个User.js文件中,我有一些get / post / delete请求。例如,我有这个请求:
router.post('/biography', async(req, res, next) => {
try{
const {bio} = req.body;
const token = req.cookies.pusrd;
if(!bio || !token || typeof(bio) !== "string" || typeof(token) !== "string")
return res.json({"status": "failure", "message": "notValidParam.error"});
// change the token after success change username.
var isValid = jwt.verify(token, SECRET);
var userToCheck = isValid["username"];
var userExist = await User.findOne({username: userToCheck});
if(splitter.splitGraphemes(bio).length > 220)
return res.json({"status": "failure", "message": "biographyTooLong"});
if(!userExist)
return res.json({"status": "failure", "message": "notLoggedIn.error"});
userExist.biography = bio;
userExist.save();
return res.json({"status": "success", "message": "savedChanges.success"});
} catch(err){
console.log(req.cookies);
if(err.name == "JsonWebTokenError")
return res.json({"status": "failure", "message": "userNotLoggedIn.error"});
return res.json({"status": "failure", "message": "generalError"});
}
});
使用此代码,我遇到了未经授权的403错误(禁止使用:无效的csrf令牌)。
我执行请求的客户端代码如下:
var data = new URLSearchParams();
data.append("bio", this.state.bio);
data.append("_csrf", cookie.get('_csrf'));
fetch(server + '/api/user/biography', {
method: 'POST',
headers: {
'Content-type': 'application/x-www-form-urlencoded',
},
credentials: 'include',
body: data
}).then(
response => response.json(),
error => console.log(error)
).then((res) => {
if(res.status === "failure"){
this.showStack(this.lang.t(res.message), "error");
} else {
this.showStack(this.lang.t(res.message), "success");
}
});
我还在发帖请求中附加了 _csrf ,但不能解决问题。
我在哪里错了? catch子句中的console.log(req.cookies)
也不起作用..所以我想我的代码不会“到达” console.log。