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, Эта чтобы понять как работает CSRF защита вообще, а также для тех кто не используют фреймворк и cms
Лучше использовать фреймворк чем париться вот так?!