Мне было интересно, как работают сессии внутри, но у меня мало знаний о C (и я не уверен, где искать источник PHP для этого).
Это то, что я понимаю на сеансах в данный момент:
$_SESSION
), он сохраняется в файловой системе с соответствующим идентификатором сеанса и временем истечения срока действия. Это верно? Также каков метод, в котором создается идентификатор сеанса? Я предполагаю, что он основан на времени, но что, если два пользователя отправят запрос одновременно? Какие методы существуют внутри, чтобы предотвратить получение одинакового идентификатора?
Благодаря,
Мое понимание процесса внутренней обработки сеанса заключается в следующем:
Когда вызывается 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
хранятся в указанном хранилище.
Посмотрите на php_session_create_id в ext / session / session.c в источнике php
Это происходит так:
Поэтому получение дубликата довольно сложно. Тем не менее, вы должны ознакомиться с концепцией фиксации сеанса, которая позволяет злоумышленнику потенциально выбрать session_id, которую их цель примет – см. « Сессии и файлы cookie» для хорошего учебника.
Идентификатор сеанса – это, скорее всего, случайная строка букв и цифр. Также было бы странно, если бы PHP не проверял, чтобы он был уникальным и, следовательно, не может быть одинаковым для двух пользователей. Что касается (1) и (2), я бы сказал, что вы правы, но я недавно не работал с PHP, поэтому не стесняйтесь верить.