#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? Это было бы намного безопаснее. Но, конечно, это не дает ответа на вопрос, как идентифицировать вашу собственную серверную службу 🙂