Материал предоставлен https://it.rfei.ru

Предупреждение хищения сессии

Когда применение SSL не представляется возможным, можно продолжить аутентификацию пользователей за счет хранения наряду с остальными сведениями их IP-адресов. Для этого нужно при сохранении их сессии добавить следующую строку кода:

$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];

Затем в качестве дополнительной меры контроля при любой загрузке страницы и доступности сессии проводится следующая проверка, которая при несоответствии текущего IP-адреса сохраненному вызывает функцию different_user:

if ($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']) different_user();

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

Разумеется, нужно принимать в расчет, что пользователи, работающие через один и тот же прокси-сервер или использующие одинаковые общие IP-адреса в домашней или офисной сети, будут иметь один и тот же IP-адрес. Если это вызовет проблему, нужно опять обратиться к протоколу SSL. Можно также сохранить копию браузер-ной строки агента пользователя (той самой строки, которую разработчики помещают в свои браузеры, для того чтобы идентифицировать их по типу и версии), с помощью которой также возможно отличить пользователей друг от друга благодаря существованию широкого выбора типов, версий и компьютерных платформ. Для сохранения агента пользователя можно воспользоваться следующим кодом:

$_SESSION['ua'] = $_SERVER['HTTP_USER_AGENT'];

А для сравнения текущей строки агента с сохраненной можно воспользоваться следующим кодом:

if ($_SESSION['ua'] != $_SERVER['HTTP_USER_AGENT']) different_user();

Или, что еще лучше, можно объединить эти две проверки и сохранить их комбинацию в виде шестнадцатеричной строки, получаемой от функции md5:

$_SESSION["check" = md5($_SERVER['REMOTE_ADDR']
$_SERVER['HTTP_USER_AGENT']);

Для сравнения текущей и сохраненной строк можно воспользоваться следующим кодом:

if ($_SESSION['check'] != md5($_SERVER['REMOTE_ADDR'] .
$_SERVER['HTTP_USER_AGENT'])) different_user():
Безопасность сессииПредотвращение фиксации сессии