Реализация PHP $ _SESSION - PullRequest
       14

Реализация PHP $ _SESSION

1 голос
/ 22 октября 2010

Кто-нибудь знает, как PHP отображает идентификаторы сеансов в массивы $ _SESSION?Другими словами, с учетом идентификатора сеанса x, откуда PHP извлекает значения, чтобы заполнить массив $ _SESSION?

И с учетом идентификатора сеанса и URL-адреса, из которого он получен, есть ли вероятность, что кто-то сможетполучить доступ к значениям в массиве $ _SESSION?

Ответы [ 6 ]

3 голосов
/ 22 октября 2010

По умолчанию PHP использует обработчик сеанса files . Эти файлы хранятся в соответствии с настройкой session.save_path, но по умолчанию используется системный временный каталог (очень небезопасное расположение, рассмотрите возможность его изменения)

Этот обработчик сеанса сохраняет каждый сеанс в виде сериализованного массива PHP в файле с именем идентификатора сеанса.

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

session.gc_maxlifetime определяет, сколько секунд сеанс будет считаться действительным. После этого момента сеанс имеет небольшую вероятность быть удаленным каждый раз, когда происходит запрос. По умолчанию установлено значение 1440 секунд (или 24 минуты).

По умолчанию этот шанс равен 1%, но его можно изменить, изменив значения session.gc_probability и session.gc_divisor (по умолчанию они равны 1 и 100 соответственно).

Существуют и другие обработчики сеансов, например, включенные в расширения memcache или memcached . Однажды была одна, основанная на библиотеке общей памяти libmm, но я считаю, что она была прекращена.

2 голосов
/ 22 октября 2010

Данные сеанса обычно хранятся во временных файлах на диске (см. Параметр session.save_path ), а имя файла отражает идентификатор сеанса.

В общем, да, если кто-то задерживаетсяс идентификатором сеанса другого пользователя и отправит его вместе со своим собственным запросом, он получит доступ к сеансу этого пользователя.Одним из способов решения этой проблемы является привязка сеансов к IP-адресам и аннулирование сеанса при поступлении запроса с другого адреса.

2 голосов
/ 22 октября 2010

Информация о сеансе хранится в файловой системе сервера. В php.ini есть параметр конфигурации session.save_path. Некоторая информация о безопасности сеансов приведена здесь: http://www.php.net/manual/en/session.security.php

1 голос
/ 22 октября 2010

При реализации сессий по умолчанию (которую при необходимости можно заменить на пользовательскую) данные хранятся в локальных файлах.Ваш сервер получает идентификатор сеанса от клиента в файле cookie, находит соответствующий локальный файл на вашем сервере и заполняет данные в $ _SESSION.

Для получения доступа к этим данным требуется доступ на уровне файлов на сервере, которыйне возможно, если ваш сервер не достаточно безопасен .

1 голос
/ 22 октября 2010

Нет, это невозможно!

... если ваш код или код любого используемого компонента небезопасен.

0 голосов
/ 23 октября 2010

Вы также можете написать свой собственный обработчик сеанса, чтобы сохранить сеанс в базе данных.

Также, если вы хотите усложнить определение идентификатора сеанса, восстановить идентификатор сеанса в стратегическое время (при повышении привилегий и т. д.) - или так часто, как вы хотите.

Передать session_regenerate_id() аргумент True для уничтожения старых данных сеанса.

...