ProfiPHPProfiPHP
Категория: Полезное в PHP

Защита от CSRF в PHP

CSRF - Cross-Sire Request Forgery (межсайтовая подделка запросов).

Такая атака направлена на имитирование запроса пользователя к стороннему сайту. То есть, злоумышленник создает страницу, жертва заходит на эту страницу и направляется запрос на сайт, в котором она авторизованная. Если на сайте нет защиты от CSRF - атаки, злоумышленник, от имени пользователя может сделать много плохого.

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

Сейчас опишу, как с этим бороться.

Нужно использовать метод POST, и передавать в параметре универсальный идентификатор сессии. А при обработке формы проверять, совпадает сессия с параметром универсального идентификатора из формы.

Давайте разберем все на примере.

Для начала создаем функцию:
function generate_form_token(  ) {
return $_SESSION['csrf_token'] = substr( str_shuffle( 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM' ), 0, 10 );
}
далее в форму добавляем дополнительное скрытое поле:
<form action="" method="post">
<input name="csrf_token" type="hidden" value="'.generate_form_token( ).'" />
<input type="text" name="test" value="test" />
<input type="submit" name="submit_test" value="отправить" />
</form>
и когда проверяем данные, нужно сделать вот такую проверку:
if ( isset( $_POST['submit_test'] ) ) {
if ( isset( $_SESSION['csrf_token'] ) && $_SESSION['csrf_token'] == @$_POST['csrf_token'] )
{
// ***************************** //
// **выполняем нужную операцию** //
// ******************************//
}
}
Поскольку другой пользователь не сможет записать в сессию значение универсального идентификатора, то и не сможет выполнить никакого действия.

Думаю, данная информация будет полезна как начинающим, так и программистам с опытом работы.

Но есть один большой недостаток: $_SESSION['csrf_token'] будет генерироваться каждый раз, где есть форма. Если, например, существует форма авторизации на каждой странице, то на каждую форму генерируется новый токен, и если открыть несколько страниц и попробовать сделать авторизацию с первой страницы или вкладки, то токен, который будет передан в форме, не будет совпадать с тем , что есть в сессии. Но смысл защиты я думаю передан, кого коснется данная проблема, надеюсь сможет ее решить в зависимости от поставленной задачи. Об этой уязвимости мало говорят и мало кто знает, а для скриптов, которые бесплатные, вещь незаменимая.

Добавить комментарий

Имя:
Текст комментария: