Правильно ли я понимаю сеансы PHP? - PullRequest
15 голосов
/ 07 февраля 2009

Меня интересовало, как сеансы работают внутри, но я немного знаю C (и не уверен, где это можно найти в исходном тексте PHP).

Вот что я понимаю из сессий на данный момент:

  1. Когда вы запускаете сеанс, пользователю назначается идентификатор сеанса, который сохраняется в файле cookie.
  2. Когда данные сеанса сохраняются (через $_SESSION), они сохраняются в файловой системе с соответствующим идентификатором сеанса и временем истечения.

Это правильно? И каков метод создания идентификатора сессии? Я предполагаю, что это основано на времени, но что, если два пользователя отправят запрос одновременно? Какие внутренние методы используются для предотвращения получения одинакового идентификатора?

Спасибо

Ответы [ 3 ]

29 голосов
/ 07 февраля 2009

Насколько я понимаю, процесс обработки внутреннего сеанса следующий:

Когда вызывается session_start, PHP ищет параметр из клиента, который был отправлен через POST, GET или в cookie (в зависимости от конфигурации; см. session.use_cookies , session.use_only_cookies и session.use_trans_sid ) с именем значения session.name для использования идентификатора сеанса уже запущенного сеанса.

Если он находит действительный идентификатор сеанса, он пытается извлечь данные сеанса из хранилища (см. session.save_handler ), чтобы загрузить данные в $_SESSION. Если он не может найти идентификатор или его использование запрещено, PHP генерирует новый идентификатор, используя хеш-функцию (см. session.hash_function ) для данных источника, который генерирует случайные данные (см. session.entropy_file ).

В конце времени выполнения или при вызове session_write_close данные сеанса в $_SESSION сохраняются в назначенном хранилище.

16 голосов
/ 07 февраля 2009

Посмотрите на php_session_create_id в ext / session / session.c в источнике php

Это выглядит так:

  • получить время суток
  • получить удаленный IP-адрес
  • построить строку с секундами и микросекундами текущего времени вместе с IP-адресом
  • передать это в настроенную хеш-функцию сеанса (либо MD5, либо SHA1)
  • если настроено, добавить дополнительную случайность из файла энтропии
  • генерация окончательного хеш-значения

Так что получить дубликат довольно сложно. Однако вам следует ознакомиться с концепцией фиксации сеанса, которая позволяет злоумышленнику потенциально выбрать сессию_id, которую примет его цель - см. Сеансы и файлы cookie для хорошего учебника.

1 голос
/ 07 февраля 2009

Идентификатор сеанса, вероятно, представляет собой случайную строку букв и цифр. Также было бы странно, если бы PHP не проверял, что он уникален и поэтому не может быть одинаковым для двух пользователей. Что касается (1) и (2), я бы сказал, что вы правы, но я недавно не работал с PHP, поэтому не стесняйтесь мне не верить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...