Безопасность

Защита веб-приложений от атак CSRF: методы и лучшие практики

Комплексное руководство по защите веб-приложений от CSRF-атак. Узнайте о CSRF-токенах, атрибутах SameSite и лучших практиках безопасности.

4 ответа 1 просмотр

Как защитить веб-приложения от атак типа Cross-Site Request Forgery (CSRF)? Какие методы и лучшие практики следует применять для предотвращения CSRF-атак?

Защита веб-приложений от атак Cross-Site Request Forgery (CSRF) является критически важной задачей для обеспечения безопасности веб приложений. Основными методами защиты являются использование CSRF-токенов, атрибутов SameSite для cookie и проверку заголовков запросов. Для эффективной защиты необходимо применять комплексный подход, сочетающий несколько техник и реализующий лучшие практики безопасности.


Содержание


Что такое CSRF-атака и как она работает

CSRF (Cross-Site Request Forgery) — это тип атаки, при которой злоумышленник заставляет пользователя выполнить нежелательные действия в веб-приложении, в котором он авторизован. Атака происходит, когда пользователь посещает вредоносный сайт, который отправляет запрос к целевому приложению от имени пользователя, используя его сессию.

Механизм атаки:

  1. Пользователь входит в веб-приложение и аутентифицируется
  2. В браузере пользователя сохраняется cookie сессии
  3. Пользователь переходит на вредоносный сайт
  4. Вредоносный сайт содержит форму или JavaScript-код, отправляющий запрос к уязвимому приложению
  5. Браузер автоматически включает cookie сессии в запрос
  6. Сервер обрабатывает запрос как легитимный, так как он содержит действительную сессию

Как отмечает OWASP Foundation, “для защиты от CSRF рекомендуется использовать встроенную защиту, предоставляемую фреймворками, такими как Joomla, Spring, Struts, Ruby on Rails и .NET” [источник 1].

Почему CSRF-атаки опасны

CSRF-атаки могут привести к серьезным последствиям:

  • Изменение паролей и других параметров учетной записи
  • Совершение финансовых транзакций
  • Изменение настроек безопасности
  • Удаление данных
  • Распространение вредоносного контента

Основные методы защиты от CSRF

1. Использование CSRF-токенов

CSRF-токены — это один из самых эффективных методов защиты. Как объясняет OWASP Cheat Sheet Series, “для защиты от CSRF следует использовать проверенные механизмы, которые уже реализованы в большинстве современных фреймворков” [источник 2].

Принцип работы:

  • Сервер генерирует уникальный, непредсказуемый токен для каждой сессии
  • Токен отправляется клиенту и сохраняется в сессии
  • Клиент включает токен в каждый запрос к защищенным ресурсам
  • Сервер проверяет соответствие токена в запросе и в сессии

2. Атрибуты SameSite для cookie

Современные браузеры поддерживают атрибут SameSite для cookie, который контролирует, отправляется ли cookie в кросс-сайтовых запросах. Web Security Academy рекомендует “устанавливать атрибут SameSite для cookie сессии, чтобы браузер не отправлял cookie в кросс-сайтовых запросах” [источник 3].

Варианты атрибута SameSite:

  • Strict: Cookie отправляется только в запросах с того же сайта
  • Lax: Cookie отправляется в запросах навигации (GET) с других сайтов
  • None: Cookie отправляется во всех запросах (требует Secure)

3. Проверка заголовков запросов

Дополнительной мерой может быть проверка заголовков запросов, такой как Referer или Origin. Однако этот метод менее надежен, так как заголовки можно подделать.


Использование CSRF-токенов: лучшие практики

Генерация и хранение токенов

CSRF-токены должны:

  • Быть криптографически случайными и непредсказуемыми
  • Иметь ограниченное время жизни
  • Быть привязанными к конкретной сессии пользователя
  • Не передаваться в URL (из-за возможной утечки через логи)

Размещение токенов

Токены могут размещаться в различных местах:

  • Скрытые поля форм: Самый распространенный метод
  • Заголовки запросов: Используется в AJAX-запросах
  • Cookie: Метод “signed double-submit cookie”

Безопасность токенов

OWASP Cheat Sheet Series подчеркивает, что “для безсессионных приложений рекомендуют «signed double-submit cookie»: токен подписывается HMAC-ключом, привязанным к session ID, и проверяется на сервере” [источник 2].

Проверка токенов

Проверка должна выполняться для всех изменяющих состояние запросов (POST, PUT, DELETE, PATCH), особенно для запросов, изменяющие данные пользователя, финансовые операции и т.д.


Защита в различных фреймворках

Django

Django имеет встроенную защиту CSRF:

  • Автоматически добавляет CSRF-токен ко всем формам
  • Проверяет токен для POST-запросов
  • Токен хранится в сессии и передается через скрытое поле

Laravel

Laravel реализует защиту CSRF через:

  • МIDDLEWARE VerifyCsrfToken
  • Автоматическую генерацию токенов для форм
  • Проверку токена через заголовок X-CSRF-TOKEN

Spring Security

Spring Security предоставляет:

  • CsrfFilter для проверки токенов
  • Автоматическую генерацию токенов для JSP-страниц
  • Поддержку REST API через заголовки

.NET

.NET Framework включает:

  • ViewState MAC для защиты от подделки
  • Встроенные атрибуты для защиты форм
  • Поддержку проверок через заголовки

Как отмечает OWASP Foundation, “в качестве дополнительной меры следует генерировать уникальный токен (nonce) для каждой формы и проверять его при обработке запроса; это называется «form keys»” [источник 1].


Дополнительные меры защиты

Проверка Sec-Fetch-Site

Современные браузеры предоставляют заголовок Sec-Fetch-Site, который можно использовать для проверки источника запроса:

  • same-site: Запрос с того же сайта
  • cross-site: Запрос с другого сайта
  • none: Запрос без источника (например, file://)

Использование Content Security Policy (CSP)

CSP может ограничить выполнение скриптов с внешних сайтов, снижая риск CSRF-атак.

Проверка Referer и Origin

Хотя эти методы не являются надежными, они могут служить дополнительной защитой:

  • Проверка Referer-заголовка
  • Проверка Origin-заголовка

Web Security Academy отмечает, что “проверка заголовка Referer может помочь, но не является надёжной, поскольку его можно подделать” [источник 3].

Капчи и подтверждения действий

Для критических операций требовать дополнительное подтверждение:

  • CAPTCHA
  • Повторный ввод пароля
  • Email-подтверждение

Тестирование и аудит защиты от CSRF

Методы тестирования

  1. Ручное тестирование
  • Использование вредоносных сайтов для отправки запросов
  • Проверка отсутствия токенов в формах
  1. Автоматизированное тестирование
  • Сканирование уязвимостей
  • Фаззинг форм и API
  1. Инструменты тестирования
  • Burp Suite
  • OWASP ZAP
  • Burp Suite Web Security Scanner

Проверка токенов

При тестировании следует:

  • Проверять наличие токенов в формах
  • Убеждаться, что токены проверяются на сервере
  • Проверять, что токены уникальны и непредсказуемы

Типичные ошибки при реализации защиты

1. Неполная защита

  • Защищаются только HTML-формы, но не AJAX-запросы
  • Не защищаются все HTTP-методы
  • Отсутствует защита для API-эндпоинтов

2. Слабые токены

  • Используются предсказуемые токены
  • Токены имеют слишком короткий срок жизни
  • Токены генерируются без достаточной энтропии

3. Некорректная проверка токенов

  • Проверка только наличия токена, но не его валидности
  • Игнорирование ошибок проверки токенов
  • Недостаточное logging событий проверки токенов

4. Утечка токенов

  • Передача токенов в URL
  • Сохранение токенов в логах
  • Отправка токенов на сторонние сайты через Referer

5. Неправильная конфигурация SameSite

  • Отсутствие атрибута SameSite для cookie
  • Неправильный выбор значения атрибута SameSite
  • Отсутствие поддержки HTTPS для атрибута None

Заключение: комплексный подход к защите

Защита веб-приложений от CSRF-атак требует комплексного подхода, сочетающего несколько техник и реализующего лучшие практики безопасности. Основными элементами защиты являются:

  1. CSRF-токены: Использование уникальных, непредсказуемых токенов, привязанных к сессии
  2. Атрибуты SameSite: Правильная настройка cookie для предотвращения отправки в кросс-сайтовых запросах
  3. Фреймворк-специфическая защита: Использование встроенных механизмов защиты современных фреймворков
  4. Дополнительные меры: Проверка заголовков, CSP, дополнительные подтверждения для критических операций

Важно помнить, что ни один метод защиты не является абсолютно надежным сам по себе. Эффективная защита от CSRF достигается только при использовании комбинации методов и постоянном мониторинге безопасности. Как подчеркивает OWASP Foundation, “в качестве дополнительной меры следует генерировать уникальный токен (nonce) для каждой формы и проверять его при обработке запроса” [источник 1].

Регулярное тестирование и аудит защиты от CSRF помогут выявить и устранить уязвимости до того, как они будут использованы злоумышленниками.


Источники

  1. OWASP Foundation — Основные принципы защиты от CSRF и рекомендации по использованию встроенных механизмов защиты фреймворков: https://owasp.org/www-community/attacks/csrf

  2. OWASP Cheat Sheet Series — Подробные рекомендации по предотвращению CSRF, включая токен-паттерн и signed double-submit cookie: https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html

  3. Web Security Academy — Объяснение механизма CSRF-атак и использование атрибутов SameSite для защиты: https://portswigger.net/web-security/csrf

K

Для защиты от CSRF рекомендуется использовать встроенную защиту, предоставляемую фреймворками, такими как Joomla, Spring, Struts, Ruby on Rails и .NET. В качестве дополнительной меры следует генерировать уникальный токен (nonce) для каждой формы и проверять его при обработке запроса; это называется «form keys» и часто реализуется в Drupal и других системах. Также можно добавлять хэш (идентификатор сессии, имя функции, серверный секрет) к форме и, в случае .NET, включать идентификатор сессии в ViewState с MAC. Проверка заголовка Referer может помочь, но не является надёжной, поскольку его можно подделать.

J

Для защиты от CSRF следует использовать проверенные механизмы, которые уже реализованы в большинстве современных фреймворков: .NET, Go, Spring Security, Laravel и т.д. Если фреймворк не предоставляет встроенную защиту, применяйте токен-паттерн «synchronizer token»: генерируйте уникальный токен на сервере, храните его в сессии и отправляйте клиенту в скрытом поле формы или в заголовке. Для безсессионных приложений рекомендуют «signed double-submit cookie»: токен подписывается HMAC-ключом, привязанным к session ID, и проверяется на сервере. В браузерах, поддерживающих Fetch-Metadata, можно дополнительно проверять заголовок Sec-Fetch-Site и отклонять запросы с cross-site.

Web Security Academy / Educational Platform

Для защиты от CSRF необходимо использовать токены CSRF, которые генерируются сервером и проверяются при каждом запросе. Токен должен быть уникальным, непредсказуемым и привязанным к конкретной сессии пользователя. Кроме того, рекомендуется устанавливать атрибут SameSite для cookie сессии, чтобы браузер не отправлял cookie в кросс-сайтовых запросах. Атрибут SameSite может быть установлен в Lax (по умолчанию в Chrome с 2021 года) или Strict, чтобы усилить защиту. В качестве дополнительной меры можно проверять заголовок Referer, но это менее надёжно, чем токены CSRF.

Авторы
K
Автор
J
Руководитель проекта
J
Руководитель проекта
S
Руководитель проекта
K
Член основной команды
Источники
OWASP Cheat Sheet Series / Documentation Portal
Documentation Portal
Web Security Academy / Educational Platform
Educational Platform
Проверено модерацией
НейроОтветы
Модерация
Защита веб-приложений от атак CSRF: методы и лучшие практики