session_regenerate_id

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

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

Описание

bool session_regenerate_id ([ bool $delete_old_session = FALSE ] )

session_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.
4.3.3 Начиная с этой версии, при включённых сессионных cookie, использование session_regenerate_id() также создаст новые сессионные cookie с новым идентификатором сессии.

Примеры

Пример #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']);
}
?>

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

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