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() плохо работает с нестабильными сетями, к которым относятся мобильные и Wi-Fi-сети. Поэтому при вызове функции 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_write_close();

// Начинаем сессию с новым идентификатором
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() - Получает и (или) устанавливает название текущей сессии