session_regenerate_id () vs session_id (randomString)

Какая разница между session_id($randomString) и session_regenerate_id() ? Оба, похоже, меняют идентификатор сеанса:

session_regenerate_id () заменит текущий идентификатор сеанса на новый и сохранит текущую информацию сеанса.

session_id () используется для получения или установки идентификатора сеанса для текущего сеанса.

Если я получу это правильно, session_regenerate_id() создает новый файл сеанса и копирует данные с возможностью удаления старого файла; в то время как session_id($randomString) просто изменяет идентификатор сеанса в существующем файле.

Если да, то каковы преимущества копирования файлов? Как лучше предотвратить предотвращение точки фиксации сессии?

Этот ответ или любой другой, который я нашел, не отвечает на мой вопрос.

Хорошо, поэтому я провел некоторое тестирование, чтобы найти различия в трех разных параметрах ( session_id($id) после session_start() , session_regenerate_id() и session_regenerate_id(true) ). Это результат того, что на самом деле происходит:


session_id ($ id) после session_start

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


session_regenerate_id () и session_regenerate_id (true)

session_regenerate_id() создаст и изменит идентификатор сеанса, перенесет сеанс в новый файл и отправит файл cookie. Передача true в качестве аргумента также приведет к удалению старого файла сеанса, опустив аргумент, он оставит его.


Что касается фиксации сеанса, как session_id($id) и session_regenerate_id() самом деле будет хуже, поскольку вы создаете новые сеансы, оставляя при этом старые файлы сеансов для захвата. Единственный вариант, который может помочь при фиксации, – вызвать session_regenerate_id(true) передав аргумент.

Функция session_id просто изменит идентификатор сеанса и обновит файл cookie сеанса на клиенте. Функция session_regenerate_id будет действовать как session_id с дополнительной миграцией сеанса на сервере. Фактически, поскольку вы можете читать из документов функции session_id , его нужно вызвать до функции session_start , иначе это может привести к потере сеанса.

Пример :

условия:

  • Вы используете сеанс на основе файлов (php default)

Описание:

  • Вы начинаете новый сеанс для текущего пользователя, сгенерированный идентификатор сеанса – «1234abc», а обработчик сохранения сеанса сохраняет информацию о сеансе в /tmp/sess_1234abc .
  • Пользователь теперь покинет ваше приложение.
  • Пользователь возвращается к вашему приложению, а обработчик сохранения сеанса извлекает идентификатор сеанса «1234abc» из файла cookie сеанса; то обработчик сохранения сеанса загрузит файл данных сеанса ( /tmp/sess_SESSID в этом случае /tmp/sess_1234abc )
  • Теперь вы меняете идентификатор сеанса на «myTestSession», используя функцию session_id
  • На этом этапе cookie пользовательского сеанса обновляется
  • Пользователь покидает ваше приложение.
  • Пользователь возвращается к вашему приложению, но обработчик сохранения сеанса не смог получить данные сеанса, на самом деле он будет искать файл /tmp/sess_MyTestSession но сеанс не был изменен session_id поэтому остается /tmp/sess_1234abc !

Поэтому, если вы хотите предотвратить фиксацию сеанса, путь, безусловно, session_regenerate_id

в некотором смысле session_regenarate_id() включает session_id() внутренне.

session_id() – это способ получить или установить идентификатор сеанса. Он не обрабатывает файлы сеанса sess_* . Вы указываете его перед session_start , чтобы указать идентификатор сеанса. Создание файлов session_start и создание файлов сеанса – работа session_start позже.

С другой стороны

session_regenarate_id() – это то, что не просто устанавливает идентификатор сеанса, а также получает ваши данные сеанса из старого файла sess_* и добавляет его в новый (со случайным идентификатором) и создает новый cookie . В зависимости от параметра delete_old_session в session_regenarate_id() если установлено значение true он удалит старый связанный файл сеанса, иначе он останется в виде файла, но он будет пустым из всех данных сеанса.