Предоставьте токен csrf клиенту, находящемуся в другом домене - PullRequest
0 голосов
/ 03 апреля 2020

Я использую модуль https://www.npmjs.com/package/csurf, чтобы защитить мои публичные c маршруты от подделки межсайтовых запросов. Сервер и клиент размещены в двух разных доменах, поэтому я не могу использовать прямой способ передачи сгенерированного токена клиенту.

Я создал две разные конечные точки на сервере, / csrfToken отправка сгенерированного токена и csrf cook ie в заголовках, а маршрут / регистр должен проверить данный токен и csrf cook ie, если он правильный.

const csrfProtection = csrf({
  cookie: {
    maxAge: 900
  }
})

router.get('/csrfToken', csrfProtection, async (req, res, next) => {
  res.json({ token: req.csrfToken() });
});

router.post(
  '/register',
  csrfProtection,
  async (req, res, next) => {
    return res.send('user registered');
  }
);

Проблема, с которой я сталкиваюсь Теперь конечная точка / csrfToken открыта для всех запросов publi c, и каждый может сделать запрос на него. Так есть ли способ получить токен без предоставления учетных данных клиенту?

Я использую nuxt / vue, если это имеет отношение к решению моей проблемы.

1 Ответ

1 голос
/ 03 апреля 2020

Поскольку вы выставляете токен как JSON, вы, вероятно, делаете эти запросы, используя Ajax.

Просто убедитесь, что ваш заголовок Access-Control-Allow-Origin позволяет только вашему веб-сайту считывать данные с него.

Тогда, пока кто-нибудь может сделать запрос к конечной точке через HTTP-клиент, не являющийся Ajax, он не сможет использовать его для выполнения CSRF-атаки, потому что его токен не будет совпадать с токеном, указанным в поварении пользователя ie.

...