Intereting Posts
Какую учетную запись пользователя использует IIS 8.5, когда пул приложений использует «ApplicationPoolIdentity»? Zend Framework 2 – Несколько модулей по URL-адресу Хранение большого файла размером 100 МБ в Мондоббе Оптимизация CSS для автоматического изменения имен классов Как управлять разрешениями файлов, когда плагин php netbeans загружает файл с FTP Объедините два столбца в SQL для предложения WHERE Использование Backstretch для разных изображений для отдельных страниц Закрытие объектов внутри массивов до PHP 5.3 nohup на windows, exec, не дожидаясь окончания Когда filter_input () удаляет слэши переменных POST? Allow_url_include есть способ разрешить включение только одного URL-адреса импортировать файл csv с внешнего FTP-сайта Показывать данные на основе выбранного идентификатора в модальном всплывающем окне после нажатия кнопки php mysql Почему PHP не поддерживает сеанс между страницами? PHP Curl с флагом -data?

Правильно ли я понял PHP-сессии?

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

Это то, что я понимаю на сеансах в данный момент:

  1. Когда вы начинаете сеанс, пользователю присваивается идентификатор сеанса, который хранится в файле cookie.
  2. Когда данные сеанса сохраняются (через $_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

Это происходит так:

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

Поэтому получение дубликата довольно сложно. Тем не менее, вы должны ознакомиться с концепцией фиксации сеанса, которая позволяет злоумышленнику потенциально выбрать session_id, которую их цель примет – см. « Сессии и файлы cookie» для хорошего учебника.

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