Является ли это безопасным способом предотвращения межсайтовых подделок запросов (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