Кто-нибудь знает, как PHP сопоставляет идентификаторы сеанса с массивами $ _SESSION? Другими словами, заданный идентификатор сеанса x, где PHP вытягивает значения из набора массива $ _SESSION?
И с учетом идентификатора сеанса и URL-адреса, из которого он пришел, существует ли вероятность того, что кто-то сможет получить доступ к значениям в массиве $ _SESSION?
По умолчанию PHP использует обработчик сеанса files
. Эти файлы хранятся на основе параметра session.save_path
, но по умолчанию используется системный каталог temp (крайне ненадежное место, его можно изменить)
Этот обработчик сеанса хранит каждый сеанс как сериализованный массив PHP в файле с идентификатором сеанса.
Если вы можете узнать идентификатор сеанса до того, как он будет очищен процедурой сбора мусора сеанса, его можно будет захватить, так как PHP не делает внутренних проверок. Вы можете захотеть сделать это самостоятельно, сохранив IP-адрес пользователя в сеансе и сравнив его с их текущим IP-адресом, очистив сеанс, если они не совпадают.
session.gc_maxlifetime
определяет, сколько секунд сеанс считается действительным. После этого момента сеанс имеет небольшую вероятность быть удаленным каждый раз при возникновении запроса. Значение по умолчанию – 1440 секунд (или 24 минуты).
По умолчанию этот шанс составляет 1%, но может быть изменен путем настройки значений session.gc_probability
и session.gc_divisor
(по умолчанию они равны 1 и 100 соответственно).
Существуют и другие обработчики сеанса, такие как те, что включены в расширения memcache или memcached . Когда-то один был основан на libmm
общей памяти libmm
, но я считаю, что это было прекращено.
Информация сеанса хранится в файловой системе сервера. В php.ini есть параметр конфигурации session.save_path. Некоторая информация о безопасности сеансов приведена здесь: http://www.php.net/manual/en/session.security.php
Данные сеанса обычно хранятся во временных файлах на диске (см. Параметр session.save_path ), и имя файла отражает идентификатор сеанса.
В общем, да, если кто-то получит идентификатор сеанса другого пользователя и отправит его вместе со своим собственным запросом, он получит доступ к сеансу этого пользователя. Один из способов решения этого – связать сеансы с IP-адресами и аннулировать сеанс, когда запрос поступает с другого адреса.
Нет, нет возможности!
… если ваш код или код любого используемого компонента небезопасны.
При использовании по умолчанию реализации сеансов (которые могут быть заменены специальным, если это необходимо) данные хранятся в локальных файлах. Ваш сервер получает идентификатор сеанса от клиента в cookie, находит соответствующий локальный файл на вашем сервере и заполняет данные в $ _SESSION.
Для получения доступа к этим данным требуется доступ на уровне файлов на сервере, что невозможно, если только ваш сервер недостаточно безопасен .
Вы также можете написать собственный обработчик сеанса для сохранения сеанса в базе данных.
Кроме того, если вы хотите затруднить привязку идентификатора сеанса, восстановите идентификатор сеанса в стратегическое время (при повышении привилегий и т. Д.) – или так часто, как вы хотите.
Передайте session_regenerate_id()
аргумент True
чтобы уничтожить старые данные сеанса.