<?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']);
}
?>