Кража сессий в PHP. От чего и каким образом нужно защищать данные?

кража сессий в php. от чего и каким образом нужно защищать данные?

Какова опасность кражи сессии

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

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

Заметка
Прежде всего, необходимо понять, что кража сессий не является проблемой PHP. Эта уязвимость кроется в особенностях устройства сети. Основной способ хищения сессий - прослушивание пакетов HTTP-запросов. Например, хакер может взять под контроль Wi-Fi роутер в общественном месте и сканировать сообщения, отправляемые пользователями. Всё что ему нужно – это просматривать cookie в заголовках.

Обеспечение безопасности сессии

Как и говорилось выше, основным способом хищения сессий является прослушивание HTTP-сообщений. Избавиться от этой проблемы можно за счет использования SSL-сертификата и шифрования трафика. Вы не раз посещали сайты, применяющие эту технологию. Их URL-адреса начинаются с протокола https. Такой род связи клиента и сервера исключает возможность перехвата данных. Даже если злоумышленник получит ваши сетевые пакеты, то не сможет расшифровать их без закрытого ключа.

Мы рекомендуем установить параметр session.use_only_cookies PHP интерпретатора в значение on. Сделать это можно в файле конфигурации php.ini. Данная опция запретит подстановку сессионного идентификатора к URL-строке запроса. Это происходит автоматически, если у пользователя отключена поддержка cookie.

Передача идентификатора в строке запроса является очень серьезной брешью в безопасности. Пользователь может скопировать строку из браузера и выложить её в публичный доступ. Например, вставить на форуме в качестве ссылки. Таким образом, любой человек, перешедший по этой ссылке, автоматически авторизуется на ресурсе с правами пользователя.

В PHP существует и более надежный способ защиты сессии. Он являются своего рода комплексным решением против менее популярных, но все же действенных методов кражи. Способ заключается в том, что при аутентификации пользователя в сессию записываются второстепенные данные, характеризующие его как уникального. Для этой цели идеально подходят две переменные из суперглобального массива $_SERVER. REMOTE_ADDR содержит в себе ip-адрес пользователя, а HTTP_USER_AGENT — строку, идентифицирующую его браузер.

Если сессия будет украдена и злоумышленник обратится к серверу, вы сможете проверить прислан ли запрос с того же браузера и ip-адреса. В случае несовпадений можно уничтожить сессию. Это отсеет хакера, а реальному пользователю всего лишь придется заново ввести логин пароль.

//стартуем сессию и проверяем авторизацию пользователя
session_start();

if (isset($_SESSION['authorization'])) {
    //проверяем сопадение ip-адреса и браузера
    $isBrowserMatch = ($_SESSION['browser'] === $_SERVER['HTTP_USER_AGENT']);
    $isIpMatch = ($_SESSION['ip'] === $_SERVER['REMOTE_ADDR']);

    if (!$isIpMatch || !$isBrowserMatch) {
        //уичтожаем сессию. Функция выдуманная
        echo 'Требуется повторная аутентификация!';
        dropSession();

    } else {
        echo 'Добро пожаловать, пользователь!';
    }
}

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