Webzone Публикации PHP PHP - Защита от CSRF

PHP - Защита от CSRF

14:06 , 02 Август 2019
PHP - Защита от CSRF

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

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

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

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

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

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

Для начала создаем функцию:


function generate_token(  ) {
    return $_SESSION['csrf_token'] = substr( str_shuffle( 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM' ), 0, 10 );
}


далее в форму добавляем дополнительное скрытое поле:



<form action="" method="post">
    <input name="csrf_token" type="hidden" value="<?php echo generate_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'] )
 {
   //Some actions
 }
}



Поскольку другой пользователь не сможет записать в сессию значение универсального идентификатора, то и не сможет выполнить никакого действия.

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

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

Вопросы / Комментарии / Отзывы


Amigos
16:03 , 05 Сентябрь 2019

Лучше использовать фреймворк чем париться вот так?!

Администратор
15:20 , 14 Август 2019

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