CSRF это не Counter Strike Russian Federation, а Сross Site Request Forger - подделка межсайтовых запросов или межсайтовый скриптинг.
Является между прочим самой распространенной уязвимостью. Подробнее можете почитать на википедии.

А мы научимся защищаться от них. И так, что это вообще такое?

Атака происходит следующим образом. Например, на вашем сайте выполняется какое-либо действие с проверкой авторизации. Допустим это будет действие - повышение любого юзера до администратора. Понятно, чтобы совершить это действие вы и сами должны быть администратором.

Действие происходит по ссылке http://ваш_сайт/?action=setadmin&user=123

В конце ссылки указывается ID юзера, которому хотите повысить права. Если ваш сайт имеет CSRF уязвимость, то любому юзеру знающему свой ID, будет достаточно прикрепить в пост или комментарий картинку:

<img src="http://ваш_сайт/?action=setadmin&user=егоID">

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

Как это предотвратить? Самый распространенный способ - использование токенов. Его и рассмотрим на примере PHP.

Для начала создадим произвольный токен (переменная с любым числом, а от него возьмем уже 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("У - уходи."); // Подозрительно, поэтому уведомляем.
}
?>

Вот и все. Использовав такую защиту Вы если не защитите свой сайт, то хотя бы усложните задачу взломщикам.

(Visited 328 times, 1 visits today)