我在使用快速后端的角度应用程序中使用csurf中间件进行csrf保护时遇到了一个奇怪的问题 .

基本上问题是,如果我在浏览器中清除XSRF-TOKEN cookie然后发送请求,则csurf验证不会引发错误 . 奇怪的是,如果我在验证步骤上切换一个断点并逐步执行它,它应该正确地引发错误 . 代码下面,我添加了一个注释,我放置断点使其工作:

app.use(csrf());
app.use(function (req, res, next) {
  // BREAKPOINT HERE TO MAKE IT WORK
  res.cookie('XSRF-TOKEN', req.csrfToken());
  return next();
});
app.use(function (err, req, res, next) {
  if (err.code !== 'EBADCSRFTOKEN') {
    return next(err);
  }
  req.logOut();
  req.clearCookie('XSRF-TOKEN');
  res.status(401).redirect('/login');
  return;
});

我使用Express(4.16.3)和csurf(1.8.2)和angular(1.4.3) . 我可以看到angular正确读取客户端上的cookie并正确设置 Headers . 如果从客户端删除cookie然后发送请求,我还可以看到标头是预期的空白 .

由于断点使它工作,我假设这里有某种竞争条件?想知道是否有人看到过这种行为或有任何想法 .