Мне кажется, что основной целью CSRF является подтверждение того, что клиент, делающий запрос, является клиентом, которого мы ожидаем.
Решение, которое я обычно видел, это:
- Сервер генерирует случайный токен CSRF
- Сервер устанавливает токен CSRF в cookie
- Сервер вводит токен CSRF в форму при создании формы ИЛИ
- Сервер передает токен CSRF в javascript, а javascript вводит токен CSRF в качестве заголовка в XMLHTTPRequests
- Когда запрос получен, он проверяется путем проверки того, что токен CSRF в файле cookie соответствует CSRFтокен в значении заголовка / формы.
Мне кажется, что сервер генерирует CSRF для (3) (1), но я не могу найти причину, почему это необходимоfor (3) (2).
Вместо этого, если клиент является чистым javascript, я считаю, что это безопасно:
- Javascript генерирует случайный токен CSRF
- Javascript устанавливает токен CSRFв файле cookie
- Javascript передает маркер CSRF в заголовке при создании XMLHTTPRequest
- Сервер проверяет, совпадает ли маркер CSRF в заголовке и файле cookie
Насколько я понимаю,что 3 и 4 - вещи, которые атакующий не может сделать, так что это также в достаточной степени блокирует атаки.Это правильно?
Если это является безопасным, нужно ли нам вообще делать шаги (1) и (2)?Будет ли это также безопасно из-за политики того же происхождения (при условии, что cors настроен правильно)?
- Javascript устанавливает заголовок «CSRF-Safe: true» в XMLHTTPRequest
- Проверки серверачто заголовок CSRF-Safe существует и имеет значение «true»