Авторка: Kateryna Ivanenko, Invicti Brand Manager
Что такое CSRF?
Подделка межсайтовых запросов (CSRF) – это тип атаки на веб-приложения, когда злоумышленник заставляет браузер аутентифицированного пользователя выполнить нежелательное действие на доверенном веб-сайте.
Преступник создает внешний ресурс (например, веб-приложение, пост на форуме), который отправляет запрос на целевой сайт от имени пользователя.
Поскольку браузер автоматически добавляет файлы cookie аутентификации, сервер не может определить, является ли запрос легитимным или поддельным.
В результате злоумышленники могут принудительно выполнить серьезные действия: изменение паролей, адресов электронной почты, перевод средств, смена настроек аккаунта и т.д.
Если пользователь имеет права администратора, атака может привести к полной компрометации веб-приложения.
Как защититься от CSRF: ключевые методы
Ниже приведены наиболее эффективные методы предотвращения CSRF, рекомендованные OWASP и другими авторитетными источниками.
1. Анти-CSRF токены
Наиболее рекомендуемый метод.
При создании HTML-формы сервер создает уникальный, непредсказуемый и криптографически устойчивый токен. Он привязан к пользователю/сессии и проверяется на стороне сервера. После получения запроса сервер проверяет, соответствует ли токен хранящемуся для сессии пользователя.
Каждый запрос на форму или изменение состояния (например, POST, изменение настроек, перевод средств) должен содержать анти-CSRF токен. Если его нет – запрос следует заблокировать.
Это можно реализовать с помощью:
- Токенов с сохранением состояния (хранятся на сервере)
- Токенов без сохранения состояния (подписанных токенов или на основе HMAC)
GET не должен использоваться для действий с изменением состояния.
2. Политика файлов cookie SameSite и настройка безопасных файлов cookie
Следует отправлять файлы cookie сессии только тогда, когда запрос поступает с того же сайта (SameSite=strict или lax).
Это значительно усложняет попытки CSRF, поступающие с внешних веб-сайтов.
Даже если анти-CSRF токены не реализованы, политика использования файлов cookie SameSite добавляет дополнительный уровень безопасности, хотя это не полное решение проблемы.
3. Проверка HTTP-заголовков
Следует проверять заголовки Origin или Referer, чтобы убедиться, что запрос проходит из ожидаемого домена.
Современная защита также включает использование заголовков Fetch Metadata (Sec-Fetch-Site, Sec-Fetch-Mode и т.д.), что позволяет серверу определить, поступает ли запрос с того же сайта или из внешнего контекста.
4. Кастомные заголовки для запросов AJAX/API
Для конечных точек AJAX или API, изменяющих состояние, приложения могут потребовать кастомные заголовки (например, X-Requested-With или другие) и проверять их на сервере.
Браузеры не позволяют внешним сайтам отправлять кастомные заголовки без CORS (Cross-Origin Resource Sharing), поэтому это блокирует большинство межсайтовых запросов.
Однако, если политика CORS слишком слаба, это может не сработать должным образом.
5. Использование фреймворков/библиотек со встроенной защитой от CSRF
Большинство современных фреймворков включают защиту CSRF “из коробки”. Стоит использовать их вместо того, чтобы создавать что-то собственное.
Если фреймворку не хватает встроенной защиты, можно добавить библиотеку или модуль.
Тестирование веб-сайтов на CSRF
Тестирование безопасности является важной частью общей стратегии, поскольку оно может точно дать знать, что веб-сайт действительно не уязвим к CSRF. Это можно сделать с помощью статического анализа (SAST) и тестирования методом черного ящика (DAST).
- SAST обнаруживает уязвимости непосредственно в коде, позволяя сканировать всю базу кода. Для этой цели можно использовать быстрый движок Mend SAST.
- DAST безопасно имитирует действия злоумышленника на веб-сайтах, чтобы обнаружить уязвимости, как это делают хакеры в реальных обстоятельствах. Invicti (на основе Acunetix и Netsparker) также может подтверждать результаты, чтобы повысить точность и сэкономить время.
Если вы хотите бесплатно протестировать Invicti DAST или Mend SAST, оставьте свои контактные данные ниже, и мы свяжемся с вами в течение рабочего времени:







