Анти-CSRF токен и Javascript

Я пытаюсь защитить приложение (php и много JS) от CSRF.

Я хочу использовать токены.

Многие операции выполняются с AJAX, поэтому я должен передать токен в Javascript. Если я хочу сгенерировать 1 токен за сеанс или загрузку страницы, это просто - я генерирую новый токен, помещаю его где-то в DOM, а затем нахожу его с помощью Javascript и отправляю на сторону обработки.

Но что, если я хочу использовать новый токен для каждой операции? Я думал о том, чтобы сделать ajax-вызов для регенерации токена, а затем передать результат на страницу обработки.

Увеличивает ли это риск для безопасности? Я думал о том, чтобы заманить пользователя на страницу со скриптом, который будет запрашивать токен, а затем использовать его для выполнения запроса, но опять же междоменный Javascript запрещен. Можно ли это сделать со вспышкой?

Может быть, другой подход для защиты вызовов ajax от CSRF?

Спасибо!

1 ответ

Решение

Существует несколько методик, которые при совместном использовании обеспечивают достаточную защиту CSRF.

Уникальный токен

Один токен, специфичный для сессии, подходит для большинства приложений. Просто убедитесь, что на вашем сайте нет XSS-уязвимостей, в противном случае любой используемый вами метод токена является пустой тратой.

Вызов AJAX для регенерации токена - плохая идея. Кто будет охранять охрану? Если сам вызов AJAX уязвим для CSRF, он как бы побеждает цель. Несколько жетонов с AJAX вообще плохая идея. Это вынуждает вас сериализовать ваши запросы, т.е. только один AJAX-запрос разрешен за один раз. Если вы готовы смириться с этим ограничением, вы можете использовать дополнительный токен для второго вызова AJAX в ответ на первый запрос.

Лично я считаю, что лучше провести повторную аутентификацию пользователя для критических транзакций и защитить оставшиеся транзакции с помощью токена, специфичного для сессии.

Пользовательский заголовок HTTP

Вы можете добавить собственный HTTP-заголовок к каждому из ваших запросов и проверить его наличие на стороне сервера. Фактический ключ / значение не должен быть секретным, сервер просто должен убедиться, что он существует во входящем запросе.

Этот подход достаточно хорош для защиты CSRF в новых версиях браузеров, однако его можно обойти, если у вашего пользователя есть более старая версия Flash Player.

Проверка реферера

Проверка заголовка Referrer также полезна для защиты CSRF в новых браузерах. Подделать этот заголовок невозможно, хотя это было возможно в более старых версиях Flash. Таким образом, хотя он не является надежным, он все же добавляет некоторую защиту.

Решающая капча

Принуждение пользователя к поиску капчи также эффективно против CSRF. Это чертовски неудобно, но довольно эффективно. Это, пожалуй, единственная защита от CSRF, которая работает, даже если у вас есть уязвимости XSS.

Резюме

  1. Используйте токен на основе сеанса, но повторно аутентифицируйтесь для транзакций с высокой стоимостью
  2. Добавьте пользовательский заголовок http, а также проверьте наличие реферера. Оба не являются надежными, но не причиняют вреда
Другие вопросы по тегам