Разработка защищенных токенов

Аватар
Johnny Walker
Chief Editor
7 августа 2024 Updated on  Обновлено   8 августа 2024

Anti-CSRF токены, также известные как токены CSRF, представляют собой специальные значения, применяемые в веб-приложениях для предотвращения атак, связанных с подделкой межсайтовых запросов (CSRF или XSRF). Эти атаки, осуществляемые на стороне клиента, могут направлять пользователей на вредоносные веб-сайты, воровать конфиденциальные данные или выполнять другие действия от имени пользователя. В данной статье мы рассмотрим использование токенов CSRF для защиты пользователей от таких атак и их последствий.

Основы Anti-CSRF токенов

Основы Anti-CSRF токенов заключаются в предоставлении браузеру пользователя уникальной информации (токена) и проверке его наличия при отправке запросов. Этот токен должен быть уникальным и недоступным для предугадывания третьим лицам. Приложение в свою очередь должно отклонить запрос, если токен отсутствует или неверен. Таким образом, только исходный пользователь имеет возможность отправлять запросы в рамках аутентифицированного сеанса.

Представим, что вы разрабатываете веб-приложение для социальной сети на домене example.biz. Для публикации сообщения в своем профиле пользователь заполняет HTML-форму и нажимает кнопку «Отправить».

<form action="/action.php" method="post"> Subject: <input type="text" name="subject"/><br/> Content: <input type="text" name="content"/><br/> <input type="submit" value="Submit"/> </form>

Это код HTML формы, который используется для отправки данных на сервер методом POST. Пользователь вводит данные в поля «Subject» и «Content», затем нажимает кнопку «Submit», что приводит к отправке запроса на сервер. Если пользователь уже вошел в систему, злоумышленник может использовать подделку межсайтовых запросов (CSRF) для выполнения нежелательных действий от его имени.

Пример CSRF-атаки представлен в следующем коде:

<form action="/action.php" method="post"> Subject: <input type="text" name="subject" value="Buy my product!"/> Content: <input type="text" name="content" value="To buy my product, visit this site: example.biz."/> <input type="submit" value="Submit"/> </form> <script> document.forms[0].submit(); </script>

Злоумышленник создает форму, автоматически заполняет поля «Subject» и «Content» и отправляет запрос с помощью скрытого JavaScript кода. В результате, если жертва вошла в систему, этот запрос будет выполнен от ее имени.

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

Как генерировать токены

Вот как генерировать и проверять токены anti-CSRF:

  1. Используйте непредсказуемый генератор случайных чисел: Для создания токенов используйте хорошо зарекомендовавший себя генератор случайных чисел с высокой степенью энтропии. Это гарантирует, что токены будут сложными для предсказания.
  2. Устанавливайте короткий срок действия: Для предотвращения повторного использования токенов установите им короткий срок действия, чтобы они стали недействительными через некоторое время после создания.
  3. Используйте безопасные методы проверки: При проверке токенов используйте безопасные методы, такие как сравнение хэшей, чтобы убедиться, что полученный токен совпадает с ожидаемым. Например, в PHP для сравнения вы можете использовать функцию

    hash_equals()

  4. Избегайте передачи токенов через GET-запросы: Не отправляйте токены CSRF в URL-адресах GET-запросов, чтобы они не были доступны в открытом виде. Это поможет предотвратить их утечку через заголовок Referer или другие уязвимости.

Пример генерации токена в PHP:

$_SESSION['token'] = bin2hex(random_bytes(24));

Пример проверки токена:

if (hash_equals($_SESSION['token'], $_POST['token'])) {
// Действие, если токен действителен
} else {
// Действие, если токен недействителен
}

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

Anti-CSRF защита для форм

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

Это можно сделать, создав токен и хешируя его с именем файла формы. Например:

hash_hmac('sha256', 'post.php', $_SESSION['internal_token'])

При получении запроса сервер проверяет соответствие хешей. Если токен действителен и форма корректна, хеши будут совпадать, обеспечивая дополнительный уровень защиты.

Anti-CSRF защита для каждого запроса

В случае необходимости высокого уровня безопасности, можно использовать индивидуальные токены для каждого запроса. Этот метод гарантирует максимальную защиту, поскольку каждый токен становится недействительным после своего использования.

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

Важно также учитывать производительность сервера при создании индивидуальных токенов для каждого запроса. Рекомендуется использовать менее ресурсоемкие методы генерации случайных чисел, чтобы минимизировать нагрузку на сервер.

Использование непостоянных токенов

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

Симметричное шифрование

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

Криптографические функции и производительность

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

Двойная отправка файлов cookie

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

CSRF защита для Ajax

Подход к защите от CSRF атак в среде Ajax требует особого внимания, особенно в контексте кросс-доменных запросов. Прежде чем реализовывать меры по защите от CSRF для Ajax, важно убедиться, что ваш веб-сервер не допускает междоменных запросов Ajax. Это можно проверить, изучив заголовки Cross-Origin Resource Sharing.

Для обеспечения безопасности в запросах Ajax следует использовать токены Anti-CSRF. Их можно внедрить как в скрытые текстовые поля, так и прямо в JavaScript. Затем каждый запрос Ajax должен содержать этот токен, который затем проверяется на стороне сервера.

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

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

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

Предотвращение CSRF атак

Для еще более надежной защиты от атак CSRF рекомендуется использовать комбинацию токенов CSRF с другими методами. Например, настройка заголовков запросов Ajax может быть важным дополнением. Этот метод эффективен благодаря политике одного источника, которая ограничивает доступ к заголовкам запросов только из одного источника JavaScript.

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

Чтобы обеспечить максимальную безопасность вашего веб-приложения, важно проверить его на все возможные уязвимости, включая, но не ограничиваясь, CSRF. Обращение к OWASP Cross-Site Request Forgery Prevention Cheat Sheet может быть полезным для получения дополнительных рекомендаций и методов предотвращения атак CSRF.

map

Связаться с нами