Защита токена CSRF с использованием cookie
Рекомендуется ли сохранять токен csrf в файле cookie или лучше использовать скрытое поле в форме? Также хорошо ли восстанавливать токен csrf при каждом запросе пользователя, например, что делают капчи?
Спасибо
3 ответа
Файл cookie CSRF, безусловно, открыт для атаки, но реализация безопасна, так как значение сеанса всегда будет проверяться по представленному значению токена, сохраненному в теле или заголовке запроса, поэтому я не вижу причины против. Шаблоны двойной отправки (только http-файл cookie против данных публикации) или шаблоны синхронизатора токена (сеанс против данных поста), представленные на веб-сайте OWASP, являются хорошими примерами, и оба используют файлы cookie.
Двойная передача, как было упомянуто ранее, перемещает хранилище клиенту, поэтому считается не имеющим состояния, но в любом случае для сравнения используются два токена, один из которых всегда остается неизвестным для атакующего.
Лучше всего включить его в форму. Идея, лежащая в основе токена CSRF, заключается в том, что он не передается пассивно (например, если злоумышленник может обмануть браузер, чтобы получить доступ к некоторому URL, который делает что-то неприятное). Печенье передается пассивно.
Лучшее объяснение этого вопроса можно найти на веб-сайте OWASP на странице Шпаргалка по профилактике CSRF OWASP.
Во-первых, использование cookie для токена CSRF может не сильно помочь, потому что все cookie, даже секретные, будут отправляться с каждым запросом. Все токены аутентификации будут отправлены независимо от того, был ли обманут конечный пользователь отправлять запрос.
Во-вторых, приложение может включать скрытый входной параметр в форме с общим именем, например "CSRFToken". Значение этого токена должно генерироваться случайным образом, чтобы злоумышленник не смог его угадать.
Кроме того, Challenge-Response является еще одним вариантом защиты для CSRF. Это может быть реализовано следующими способами:
- CAPTCHA,
- Повторная аутентификация (пароль)
- Одноразовый токен