(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)
session_regenerate_id — Генерирует и обновляет идентификатор текущей сессии
session_regenerate_id() заменяет идентификатор текущей сессии вновь сгенерированным, при этом сохраняет информацию о текущей сессии.
При включённой опции session.use_trans_sid, вывод должен осуществляться после вызова session_regenerate_id(). В противном случае будет использоваться старый идентификатор сессии.
Текущая реализация session_regenerate_id() плохо работает с сетями с нестабильным соединением, такими как мобильные и WiFi-сети. Таким образом, есть вероятность потерять сессию из-за вызова session_regenerate_id().
Вы не должны уничтожать данные старой сессии немедленно, а должны использовать временные метки удаления и контролировать доступ к старой сессии. В противном случае конкурирующий доступ к странице может привести к несогласованному состоянию, потере сессии или к состоянию гонки на стороне клиента (браузера), что, в свою очередь, приведёт к созданию множества идентификаторов сессии без необходимости. Немедленное удаление сессии также делает невозможным обнаружение и предотвращение атак при перехвате сессии.
delete_old_session
Определяет, удалять ли старый связанный файл с сессией или нет. Не следует удалять старую сессию, если требуется избегать состояния гонки из-за удаления или обнаруживать/избегать атак при перехвате сессии.
Функция возвращает true
в случае успешного выполнения или false
, если возникла ошибка.
Пример #1 Пример использования session_regenerate_id()
<?php
// ЗАМЕЧАНИЕ: Это не полностью работающий код, а только пример!
session_start();
// Проверяем временную метку удаления
if (isset($_SESSION['destroyed'])
&& $_SESSION['destroyed'] < time() - 300) {
// Обычно это не должно происходить. Это может быть атакой или результатом нестабильной сети.
Текущий модуль сессии не работает хорошо с сетями с нестабильным соединением. Вы должны управлять идентификатором сессии, чтобы избежать потери сессии в результате вызова session_regenerate_id().
Пример #2 Как избежать потери сессии при использовании session_regenerate_id()
<?php
// ЗАМЕЧАНИЕ: Это не полностью работающий код, а только пример!
// my_session_start() и my_session_regenerate_id() избегают потери
// сессии из-за нестабильной сети. В дополнение, данный код может предотвращать
// использование украденных сессий злоумышленниками.
function my_session_start() {
session_start();
if (isset($_SESSION['destroyed'])) {
if ($_SESSION['destroyed'] < time()-300) {
// Обычно это не должно происходить. Это может быть атакой или результатом нестабильной сети.