PHP·98 вопросов

Как защититься от CSRF?

Ответ

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

Генерация такого токена должна производиться с использованием криптографически стойких генераторов случайных чисел, доступных в языке PHP. Для этого идеально подходит конструкция bin2hex(random_bytes(32)), которая создает сложную для подбора шестнадцатеричную строку достаточной длины. Сгенерированное значение обязательно сохраняется в текущей сессии пользователя на стороне сервера и одновременно внедряется в скрытое поле HTML-формы или передается в заголовок AJAX-запроса.

Когда пользователь отправляет данные на сервер, PHP-скрипт должен сравнить токен из входящего запроса с тем значением, которое хранится в сессии. Если токены не совпадают или отсутствуют вовсе, запрос считается скомпрометированным и отклоняется с ошибкой доступа. Современные PHP-фреймворки, такие как Laravel, Symfony или Yii, реализуют этот механизм автоматически, встраивая проверку токенов во все POST, PUT и DELETE запросы через middleware.

Для самостоятельной реализации защиты от CSRF выполните следующие шаги:

Сгенерируйте криптостойкий токен с помощью функции bin2hex(random_bytes(32)) при открытии страницы с формой.
Сохраните полученное значение в массиве сессии $_SESSION['csrf_token'] для последующего сопоставления.
Встройте токен в HTML-форму в виде скрытого поля с именем csrf_token или передайте его в заголовках асинхронного запроса.
Выполните проверку на стороне сервера, сравнивая входящие данные с сессионным значением с использованием безопасного сравнения строк hash_equals().

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

Полезен ли этот ответ?

Другие вопросы этой темы

Связанные вопросы из других тем