Опасно ли для клиента javascript устанавливать токен CSRF? - PullRequest
3 голосов
/ 03 июля 2019

Мне кажется, что основной целью CSRF является подтверждение того, что клиент, делающий запрос, является клиентом, которого мы ожидаем.

Решение, которое я обычно видел, это:

  1. Сервер генерирует случайный токен CSRF
  2. Сервер устанавливает токен CSRF в cookie
    1. Сервер вводит токен CSRF в форму при создании формы ИЛИ
    2. Сервер передает токен CSRF в javascript, а javascript вводит токен CSRF в качестве заголовка в XMLHTTPRequests
  3. Когда запрос получен, он проверяется путем проверки того, что токен CSRF в файле cookie соответствует CSRFтокен в значении заголовка / формы.

Мне кажется, что сервер генерирует CSRF для (3) (1), но я не могу найти причину, почему это необходимоfor (3) (2).

Вместо этого, если клиент является чистым javascript, я считаю, что это безопасно:

  1. Javascript генерирует случайный токен CSRF
  2. Javascript устанавливает токен CSRFв файле cookie
  3. Javascript передает маркер CSRF в заголовке при создании XMLHTTPRequest
  4. Сервер проверяет, совпадает ли маркер CSRF в заголовке и файле cookie

Насколько я понимаю,что 3 и 4 - вещи, которые атакующий не может сделать, так что это также в достаточной степени блокирует атаки.Это правильно?

Если это является безопасным, нужно ли нам вообще делать шаги (1) и (2)?Будет ли это также безопасно из-за политики того же происхождения (при условии, что cors настроен правильно)?

  1. Javascript устанавливает заголовок «CSRF-Safe: true» в XMLHTTPRequest
  2. Проверки серверачто заголовок CSRF-Safe существует и имеет значение «true»

1 Ответ

2 голосов
/ 03 июля 2019

Да, оба этих упрощенных подхода должны быть безопасными при наличии CORS и политики одного и того же происхождения.На самом деле, вам даже не нужен заголовок CSRF-Safe: true, пока вы проверяете тип контента.

Википедия подтверждает :

Если данныеотправляется в любом другом формате (JSON, XML) стандартным методом является выдача POST-запроса с использованием XMLHttpRequest с атаками CSRF, предотвращенными SOP и CORS;есть метод отправки произвольного содержимого из простой HTML-формы с использованием атрибута ENCTYPE;такой поддельный запрос можно отличить от законных по типу текстового / простого содержимого, но если это не выполняется на сервере, CSRF может быть выполнен [12] [13]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...