session_regenerate_id

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

session_regenerate_id Генерирует и обновляет идентификатор текущей сессии

Описание

session_regenerate_id(bool $delete_old_session = false): bool

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) {
// Обычно это не должно происходить. Это может быть атакой или результатом нестабильной сети.
// Удаляем все статусы аутентификации пользователей этой сессии.
remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
throw(new
DestroyedSessionAccessException);
}

$old_sessionid = session_id();

// Устанавливаем временную метку удаления
$_SESSION['destroyed'] = time(); // session_regenerate_id() сохраняет данные старой сессии

// Просто вызов session_regenerate_id() может привести к потере сессии и т.д.
// Смотрите следующий пример.
session_regenerate_id();

// Новой сессии не требуется временная метка удаления.
unset($_SESSION['destroyed']);

$new_sessionid = session_id();

echo
"Старая сессия: $old_sessionid<br />";
echo
"Новая сессия: $new_sessionid<br />";

print_r($_SESSION);
?>

Текущий модуль сессии не работает хорошо с сетями с нестабильным соединением. Вы должны управлять идентификатором сессии, чтобы избежать потери сессии в результате вызова 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) {
// Обычно это не должно происходить. Это может быть атакой или результатом нестабильной сети.
// Удаляем все статусы аутентификации пользователей этой сессии.
remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
throw(new
DestroyedSessionAccessException);
}
if (isset(
$_SESSION['new_session_id'])) {
// Срок действия ещё не полностью истёк. Cookie могли быть потеряны из-за нестабильной сети.
// Заново пытаемся установить правильный cookie идентификатора сессиии.
// ЗАМЕЧАНИЕ: Не пытайтесь заново установить идентификатор сессии если, вы предпочитаете
// удалить флаг аутентификации.
session_commit();
session_id($_SESSION['new_session_id']);
// Новый идентификатор сессии должен существовать.
session_start();
return;
}
}
}

function
my_session_regenerate_id() {
// Новый идентификатор сессии необходим для установки правильного идентификатора сессии,
// когда идентификатор сессии не был установлен из-за нестабильной сети.
$new_session_id = session_create_id();
$_SESSION['new_session_id'] = $new_session_id;

// Устанавливаем временную метку удаления.
$_SESSION['destroyed'] = time();

// Записываем и закрываем текущую сессию.
session_commit();

// Стартуем сессию с новым идентификатором.
session_id($new_session_id);
ini_set('session.use_strict_mode', 0);
session_start();
ini_set('session.use_strict_mode', 1);

// Новой сессии не нужно это.
unset($_SESSION['destroyed']);
unset(
$_SESSION['new_session_id']);
}
?>

Смотрите также

  • session_id() - Получает и/или устанавливает идентификатор текущей сессии
  • session_create_id() - Создаёт новый идентификатор сессии
  • session_start() - Стартует новую сессию, либо возобновляет существующую
  • session_destroy() - Уничтожает все данные сессии
  • session_reset() - Реинициализирует сессию оригинальными значениями
  • session_name() - Получить или установить имя текущей сессии