Является ли это безопасным способом предотвращения межсайтовых подделок запросов (CSRF)?

Наше приложение таким образом:

  • Каждый пользователь должен войти в систему
  • страница входа отправляется обратно на сервер, и если авторизованному пользователю возвращается приложение SPA.
  • SPA-приложение полностью AJAX
  • HTTPS

Обычно мы посылаем sessionid печенье и csrftoken печенье. Значение cookie-токена будет включено в качестве x-заголовка на все сообщения AJAX, и все данные проверяются на сервере при каждом запросе.

Поскольку страница SPA создается до ее возвращения в браузер, мы можем встраивать в нее все, что захотим. Мы бы хотели, чтобы конечный пользователь мог войти на несколько вкладок, при этом одна из них не влияет на другие.

Что бы мы предпочли сделать:

  • отправьте sessionid как файл cookie, как и раньше, но имя файла cookie будет случайным.
  • нет csrftoken, но вместо этого вставьте случайное имя файла cookie в процедуру javascript, которая добавила x-заголовок к запросам AJAX-сообщений.
  • сервер получит идентификатор сеанса из x-заголовка.

Это дает нам возможность разрешить несколько входов в систему, каждый из которых имеет уникальный sessionid имя cookie, но каждый пост-запрос имеет стандартизированное имя x-заголовка.

Будет ли это так же безопасно, как сессионный cookie, метод csrftoken cookie/x-header?

1 ответ

Решение

Да, добавление заголовка, который злоумышленник не может реплицировать из сеанса действительного пользователя, является одним из способов сделать это.

например X-Requested-With может быть добавлен к каждому запросу AJAX (JQuery делает это по умолчанию), и вы просто проверяете, присутствует ли этот заголовок при получении запроса на стороне сервера. Этот заголовок не может быть отправлен между доменами, если сервер не подключился через CORS.

Вы можете объединить это с токеном - смотрите мой ответ здесь.

например

X-Requested-With: XMLHttpRequest;0123456789ABCDEF
Другие вопросы по тегам