Статьи ⇒ PHP ⇒ Фиксация сессии

Фиксация сессии

Опубликовано: 24 мар 2011 в 21:59
Автор: Chris Shiflett  Перевод: freeeeez 

Защита сессий довольно сложная тема для обсуждения, и не удивительно, что сессии часто становятся объектом для нападения. В большинстве случаев хакер пытается получить доступ к сессии другого пользователя, выдавая себя за него.

Наиболее важной частью информации для злоумышленника является инеднтификатор сессии. Есть три метода для его получения:

  • Прогнозирование
  • Захват
  • Фиксация

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

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

Фиксация — это черезвычайно простой метод получения идентификатора сессии. И я продемонстрирую это используя следующий скрипт:

<?php

session_start();

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

echo $_SESSION['visits'];

?>

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

Чтобы продемонстрировать фиксацию сессии, сначала убедитесь, что вы не имеете существующего идентификатора сессии, посетите эту страницу прибавив ?PHPSESID=1234 к URL. Затем с другого браузера (или даже с другого компьютера) посетите этот же URL, опять добавивь в конце ?PHPSESID=1234. Заметьте, что единичку на первый визит вы уже не увидите, потому что сессия уже инициирована ранее.

В чем же тут проблема? А в том, что хакер может заранее установить идентификатор сессии и направить на сайт ни о чем не подозревающего пользователя. Пользователь скорее всего ничего не заметит, так как сайт будет вести себя точно так же. А так как взломщик знает PHPSESID, он может захватить сессию этого пользователя.

Защита

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

<?php

session_start();

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

?>

Этот код регенерирует идентификатор сессии, тем самым заменит его на непредсказуемое значение, затем установит значение is_valid в true. С этим подходом можно не беспокоиться, что кто-то может использовать фиксации сессий.

Поскольку регенерация сессии требует установления нового cookie, выполнение этого кода должно происходить перед отправкой содержимого сайта.

2 комментария
6 529 просмотров


#1 Борис, 3 мар 2012 в 21:29
А если куки отключен ?
Как тогда регенерировать сессию ?
#2 freeeeez, 4 мар 2012 в 17:59
Борис, если куки отключены, ID сессии можно передавать в URL, но сейчас уже так никто не делает. Это не безопасно, как было написано выше. Следует предупреждать пользователя о включении cookies. По другому сессии на PHP не работают.

Оставить комментарий:

Имя:
Email:
Сайт:
Комментарий:

Допустимые теги: <em> • <strong> • <u> • <sub> • <sup> • <blockquote>

Проверочный код:

Введите проверочный код, для подтверждения, что вы не робот.
P.S. Если вы робот, то, к сожалению, вы
не сможете прочитать символы с картинки.