Несоответствие токенов CSRF: как защитить свой сайт от подделки межсайтовых запросов

Если вы когда-либо сталкивались с неприятным сообщением об ошибке «Несоответствие токена CSRF», то вы, вероятно, знакомы с концепцией атак с подделкой межсайтовых запросов (CSRF). Атаки CSRF используют доверие между веб-сайтом и его аутентифицированными пользователями, позволяя злоумышленникам выполнять несанкционированные действия от имени ничего не подозревающих пользователей. В этой статье мы углубимся в атаки CSRF, объясним важность токенов CSRF для защиты от них и рассмотрим различные методы защиты вашего сайта от уязвимостей CSRF.

Понимание CSRF-атак:

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

Токены CSRF 101:

Токен CSRF — это уникальное и непредсказуемое значение, генерируемое сервером и связанное с сеансом пользователя. Он действует как секретный «пароль», который должен быть включен в каждый запрос на изменение состояния, отправляемый на сервер. Проверяя действительность токена, сервер гарантирует, что запрос исходит от самого веб-сайта, а не из внешнего источника. Всякий раз, когда происходит несоответствие токена CSRF, это означает, что токен, включенный в запрос, не соответствует ожидаемому сервером.

Методы защиты от CSRF-атак:

  1. Реализация файлов cookie двойной отправки.
    Один из самых простых способов защиты от атак CSRF — использование файлов cookie двойной отправки. В этом методе сервер устанавливает файл cookie, содержащий значение токена CSRF, при этом тот же токен также включается в полезные данные или заголовки запроса. При получении запроса сервер сравнивает токен в файле cookie с токеном в запросе, чтобы проверить их согласованность.

    Пример фрагмента кода (на PHP):

    <?php
    // Setting CSRF token in cookie
    setcookie('csrf_token', $csrfTokenValue, time() + 86400, '/', 'example.com', true, true);
    
    // Including CSRF token in request payload or headers
    $csrfToken = $_COOKIE['csrf_token'] ?? '';
    // ...
  2. Шаблон токена синхронизатора.
    Шаблон токена синхронизатора включает в себя встраивание токена CSRF в скрытое поле формы. Когда пользователь отправляет форму, сервер проверяет, соответствует ли токен тому, который хранится в сеансе. Этот метод гарантирует, что действительными будут считаться только запросы, исходящие с самого веб-сайта.

    Пример фрагмента кода (в формате HTML):

    <form action="/process" method="POST">
     <input type="hidden" name="csrf_token" value="{{ csrf_token }}">
     <!-- Other form fields -->
     <button type="submit">Submit</button>
    </form>
  3. Токен в настраиваемом заголовке запроса.
    Вместо того, чтобы включать токен CSRF в поля формы или файлы cookie, его можно отправить в настраиваемом заголовке. Этот подход особенно полезен при выполнении запросов AJAX или при использовании платформ, обрабатывающих запросы через специальные заголовки.

    Пример фрагмента кода (в JavaScript с использованием jQuery):

    $.ajax({
     url: '/process',
     type: 'POST',
     headers: {
       'X-CSRF-Token': 'csrf_token_value',
     },
     // ...
    });
  4. Атрибут SameSite:
    Атрибут SameSite можно установить для файлов cookie, чтобы ограничить их использование только запросами на один и тот же сайт. Установив для атрибута SameSite значение «Строгий» или «Слабый», вы можете запретить отправку файлов cookie с межсайтовыми запросами, тем самым уменьшая атаки CSRF.

    Пример фрагмента кода (на PHP):

    setcookie('session_cookie', $sessionValue, [
     'expires' => time() + 86400,
     'path' => '/',
     'domain' => 'example.com',
     'secure' => true,
     'httponly' => true,
     'samesite' => 'Lax',
    ]);

Защита вашего веб-сайта от атак CSRF имеет решающее значение для обеспечения безопасности и доверия ваших пользователей. Внедряя надежные меры защиты от CSRF, такие как файлы cookie двойной отправки, шаблон токена синхронизатора, настраиваемые заголовки запросов и использование атрибута SameSite, вы можете значительно снизить риск стать жертвой уязвимостей CSRF. Будьте активны, обеспечивайте безопасность своего веб-сайта и защищайте данные своих пользователей от несанкционированных манипуляций.