(PHP 4 >= 4.3.2, PHP 5, PHP 7)
session_regenerate_id — Генерирует и обновляет идентификатор текущей сессии
$delete_old_session
= FALSE
] ) : boolsession_regenerate_id() заменяет идентификатор текущей сессии вновь сгенерированным, при этом сохраняет информацию о текущей сессии.
При включённой опции session.use_trans_sid, вывод должен осуществляться после вызова session_regenerate_id(). В противном случае будет использоваться старый идентификатор сессии.
Текущая реализация session_regenerate_id() плохо работает с сетями с нестабильным соединением, такими как мобильные и WiFi-сети. Таким образом, есть вероятность потерять сессиию из-за вызова session_regenerate_id().
Вы не должны уничтожать данные старой сессии немедленно, а должны использовать временные метки удаления и контролировать доступ к старой сессии. В противном случае конкурирующий доступ к странице может привести к несогласованному состоянию, потере сессии или к состоянию гонки на стороне клиента (браузера), что, в свою очередь, приведёт к созданию множества идентификаторов сессии без необходимости. Немедленное удаление сессии также делает невозможным обнаружение и предотвращение атак при перехвате сессии.
delete_old_session
Определяет, удалять ли старый связанный файл с сессией или нет. Не следует удалять старую сессию, если требуется избегать состояния гонки из-за удаления или обнаруживать/избегать атак при перехвате сессии.
Возвращает TRUE
в случае успешного завершения или FALSE
в случае возникновения ошибки.
Версия | Описание |
---|---|
7.0.0 | session_regenerate_id() перед закрытием сохраняет данные старой сессии. |
5.1.0 |
Добавлен параметр delete_old_session .
|
Пример #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(); // Начиная с PHP 7.0.0 и выше, 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']);
}
?>