Защита от CSRF
CSRF это не Counter Strike Russian Federation :), а Сross Site Request Forger - подделка межсайтовых запросов или межсайтовый скриптинг.
Является между прочим самой распространенной уязвимостью. Подробнее можете почитать на .
А мы научимся защищаться от них. И так, что это вообще такое?
Атака происходит следующим образом. Например, на вашем сайте выполняется какое-либо действие с проверкой авторизации. Допустим это будет действие - повышение любого юзера до администратора. Понятно, чтобы совершить это действие вы и сами должны быть администратором.
Действие происходит по ссылке http://ваш_сайт/?action=setadmin&user=123
В конце ссылки указывается ID юзера, которому хотите повысить права. Если ваш сайт имеет CSRF уязвимость, то любому юзеру знающему свой ID, будет достаточно прикрепить в пост или комментарий картинку:
<img src="http://ваш_сайт/?action=setadmin&user=егоID">
Остается только ждать пока вы увидите эту картинку, конечно же самого изображения не будет, но браузер сделает запрос и юзер тут же превратится в администратора.
Как это предотвратить? Самый распространенный способ - использование токенов. Его и рассмотрим.
Для начала создадим произвольный токен (переменная с любым числом, а от него возьмем уже md5 хэш)
<?php $proverka = md5(rand(1, time())); $_SESSION['proverka'] = $proverka; ?>
И так, переменная есть. Теперь надо добавить эту переменную к каждой форме или ссылке как параметр. Получается что только у нас в сессии хранится секретный параметр, его мы будем проверять при совершении действия.
<input name="secret_pole" type="hidden" value="<?=$proverka?>">
И проверяем, когда нужно выполнить действие.
<?php
$proverka=$_POST['proverka']; // Или $_GET, в зависимости от того как посылаем данные
if($_SESSION['proverka'] == $proverka) {
$_SESSION['proverka'] = ''; // Убиваем
// Исполняем скрипт
} else {
die("Fuck off."); // Подозрительно, поэтому уведомляем.
}
?>
Вот и все. Использовав такую защиту Вы если не защитите свой сайт, то хотя бы усложните задачу взломщикам.


(7 votes, average: 3,86 из 5)