【问题标题】:Disable csrf when express route is called internally内部调用 express 路由时禁用 csrf
【发布时间】:2021-05-07 02:14:38
【问题描述】:

我有以下简单的代码来启用 csrf 保护

import csrf from 'csurf';

const csrfProtection = csrf({
  cookie: {
    httpOnly: true,
    secure: process.env.NODE_ENV === 'production',
  },
});


app.use(csrfProtection);

这意味着所有应用路由都在使用中间件,并且

router.get('/auth/csrf', (req, res) => {
  res.json({ csrfToken: req.csrfToken() });
});

在向该服务器发出请求之前必须先调用。

现在,我有另一个后端微服务正在对一个端点进行 API 调用,我不想在后端服务调用端点时启用 csrf 检查。但是如果它来自其他地方,想要保留检查。

哪种方法适合我的情况?

【问题讨论】:

  • CSRF 用于保护机器人免受攻击。如果你为特定的机器人(也就是你的后端服务)设置了后门,那么你也会削弱对其他机器人的保护。
  • IP 白名单是一种可行的方法。网站将 Googlebot 的 IP 地址(和其他知名机器人)列入白名单是很常见的,这样它们就可以被抓取,但仍会阻止其他机器人流量,例如

标签: javascript node.js express csrf


【解决方案1】:

如果您的应用程序中确实需要 CSRF,那么您可能不应该禁用它。话虽如此,您可以使用自定义中间件为您的路由选择可选的 CSRF:

import csrf from 'csurf';

const csrfProtection = csrf({
  cookie: {
    httpOnly: true,
    secure: process.env.NODE_ENV === 'production',
  },
});

function optionalCSRF(req, res, next) {
  if (req.query.disableCSRF === 'true') {
    return next();
  }

  csrfProtection(req, res, next);
}

app.use(optionalCSRF);

【讨论】:

  • 所以如果我不应该禁用它,如何在发出内部请求的同时提供 csrf?有一些服务可以使用的预定义值是否有意义?
  • 我对面向公众的应用程序的经验并不丰富,但我脑海中浮现出一些想法。您可以想出一种方法,让您的后端服务为每个请求生成自己的令牌(并将它们存储在您的 API 服务可访问的地方),并且如果提供了令牌,您的 API 服务可以验证令牌。
  • 您可以删除 CSRF 并添加 Google 的 reCaptcha 代替吗?这样会更安全。但这当然不能回答如何识别您自己的后端服务:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 2015-10-22
  • 2019-11-12
  • 2012-08-24
相关资源
最近更新 更多