Фиксация сессий в PHP. В чем отличие от кражи?

фиксация сессий в php. в чем отличие от кражи?

Как происходит фиксация сессии

К самым простым атакам на веб-ресурсы относится фиксация сессий. В связи с ростом технической грамотности программистов и строгих настроек PHP по умолчанию данный вид взлома практически потерял свою актуальность. Однако мы все же рассмотрим его механизм и способы защиты.

Фиксация возможна при передаче идентификатора сессии в URL-адресе. PHP автоматически отыскивает в строке запроса соответствующую переменную и по ней осуществляет инициализацию сессии. За такое поведение отвечает параметр session.use_only_cookies конфигурационного файла php.ini. Если значение этого параметра установлено в off, идентификатор сессии может быть передан только в cookie.

Механизм фиксации заключается в том, что злоумышленник может зайти на страницу ресурса, предоставив в строке запроса идентификатор сессии, сгенерированный им самим. PHP при обработке запроса создаст для этого идентификатора файл хранения данных. В общих словах сервер примет эту сессию как будто она создавалась в обычном режиме. В таком поведении нет ничего ошибочного.

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

Примером скрипта, уязвимого к фиксации сессии, может послужить код, приведенный ниже. Вызовите его на выполнение с передачей идентификатора сессии в URL-адресе. Например, http://test-site/?PHPSESSID=45636. Перезагрузите пару раз страницу. Вы увидите изменяющийся счетчик посещений. Откройте другой браузер и скопируйте в адресную строку этот URL-адрес. Счетчик продолжит увеличиваться.

//Старутем сессию и обновляем счетчик посещений
session_start();

if (!isset($_SESSION['visits'])) {
    $_SESSION['visits'] = 1;
} else {
    $_SESSION['visits']++;
}

echo "Cчетчик посещений: {$_SESSION['visits']}";

Заметка
В большинстве случаев степень опасности зависит от того, какие именно данные приложение хранит в сессии. Мы настоятельно рекомендуем устанавливать параметр конфигурации session.use_only_cookies в значение on. Это оградит ваше PHP-приложение от фиксации сессии через передачу идентификатора в строке запроса.

Защита сессии от фиксации

Как и говорилось выше, простейшим способом защиты от фиксации сессии в PHP является установка параметра session.use_only_cookies конфигурационного файла php.ini в значение on. Это запретит передачу идентификатора сессии в URL-адресе запроса.

В качестве дополнительной защиты сессии можно использовать функцию session_regenerate_id(). Она изменяет идентификатор текущей сессии при этом сохраняя все её данные. Таким образом, злоумышленник не сможет воспользоваться идентификатором, сгенерированным самостоятельно.

Обратите внимание на пример. В нем с помощью специальной сессионной переменной проверяется статус активности. Если переменная не задана, мы регенерируем идентификатор. Это позволяет создать для злоумышленника новую сессию с его идентификатором, затем изменить его. Смысл заключается в том, что идентификатор взломщика устареет после первого запроса. Сессии обычных пользователей будут создаваться нормальным способом вместе с установкой статусной переменной. Поэтому идентификаторы обычных пользователей никогда не перезапишутся.

//все как в предыдущем примере, но с проверкой сессии
session_start();

if (!isset($_SESSION['isActive'])) {
    $_SESSION['isActive'] = true;
    session_regenerate_id();
}

if (!isset($_SESSION['visits'])) {
    $_SESSION['visits'] = 1;

} else {
    $_SESSION['visits']++;
}

//счетчик всегда будет показывать единицу, если
//идентификатор сессии передан в URL-адресе запроса
echo "Cчетчик посещений: {$_SESSION['visits']}";

Последние публикации