Существует несколько методов, которые при совместном использовании обеспечивают достаточную защиту от CSRF.
Уникальный токен
Для большинства приложений достаточно одного токена для конкретного сеанса. Просто убедитесь, что на вашем сайте нет XSS-уязвимостей, в противном случае любая техника токенов, которую вы используете, будет пустой тратой времени.
Вызов AJAX для повторного создания токена — плохая идея. Кто будет охранять охранников? Если сам вызов AJAX уязвим для CSRF, это как бы противоречит цели. Множественные токены с AJAX — вообще плохая идея. Это заставляет вас сериализовать ваши запросы, т.е. разрешен только один запрос AJAX за раз. Если вы готовы жить с этим ограничением, вы, возможно, можете добавить токен для второго вызова AJAX в ответ на первый запрос.
Лично я считаю, что лучше повторно аутентифицировать пользователя для критических транзакций и защитить оставшиеся транзакции токеном для конкретного сеанса.
Пользовательский заголовок HTTP
Вы можете добавить собственный HTTP-заголовок к каждому из ваших запросов и проверить его наличие на стороне сервера. Фактический ключ/значение не обязательно должен быть секретным, серверу просто нужно убедиться, что он существует во входящем запросе.
Этот подход достаточно хорош для защиты CSRF в более новых версиях браузеров, однако его также можно обойти, если у вашего пользователя есть более старая версия Flash Player.
Проверка реферера
Проверка заголовка Referrer также хороша для защиты CSRF в новых браузерах. Подменить этот заголовок невозможно, хотя в старых версиях Flash это было возможно. Таким образом, хотя он и не является надежным, он все же добавляет некоторую защиту.
Решение CAPTCHA
Принуждение пользователя решать капчу также эффективно против CSRF. Это чертовски неудобно, но довольно эффективно. Это, пожалуй, единственная CSRF-защита, которая работает, даже если у вас есть XSS-уязвимости.
Сводка
- Используйте токен на основе сеанса, но повторно аутентифицируйте для транзакций с высокой стоимостью
- Добавьте собственный заголовок http, а также проверьте реферер. Оба ненадежны сами по себе, но не причиняют вреда
person
Sripathi Krishnan
schedule
08.09.2010