Отключите csrf при внутреннем вызове экспресс-маршрута

#javascript #node.js #express #csrf

#javascript #node.js #экспресс #csrf

Вопрос:

У меня есть следующий простой код для включения защиты 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, когда это внутренняя служба, вызывающая конечную точку. Но вы хотите сохранить проверки, если они поступают из других источников.

Какой подход будет работать в моем случае?

Комментарии:

1. CSRF существует для защиты от ботов. Если вы устанавливаете бэкдор для определенного бота (он же ваш серверный сервис), вы также ослабляете свою защиту от других ботов.

2. Белый список IP-адресов — это возможный способ сделать это. Очень часто веб-сайты заносят в белый список IP-адреса Googlebot (и других известных ботов), чтобы их можно было обойти, но при этом блокировать другой трафик ботов, например

Ответ №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);
 

Комментарии:

1. итак, если я не должен его отключать, как можно предоставить csrf при выполнении внутреннего запроса? Имеет ли смысл иметь некоторые предопределенные значения, которые может использовать служба?

2. Я не очень разбираюсь в общедоступных приложениях, но мне приходят в голову некоторые идеи. Вы можете придумать способ, которым ваши серверные службы генерируют свои собственные токены для каждого запроса (и хранят их где-нибудь, доступные вашей службе API), и ваша служба API может проверять токены, если они предоставлены.

3. Вы можете удалить CSRF и вместо этого добавить reCAPTCHA от Google? Это было бы намного безопаснее. Но, конечно, это не дает ответа на вопрос, как идентифицировать вашу собственную серверную службу 🙂