Я работаю над безопасностью своего сайта и понимаю, почему session_regenerate_id следует использовать осторожно.
В документации по php (https://www.php.net/manual/fr/function.session-regenerate-id.php) говорится:
В настоящее время session_regenerate_id плохо обрабатывает нестабильную сеть, например, Мобильная и WiFi сеть. Поэтому вы можете потерять сеанс, вызвав session_regenerate_id.
Вы не должны немедленно уничтожать старые данные сеанса, но должны использовать метку времени уничтожения и контролировать доступ к старому идентификатору сеанса. В противном случае одновременный доступ к странице может привести к несогласованному состоянию, или вы могли потерять сеанс, или это может привести к состоянию гонки на стороне клиента (браузера) и может создать множество идентификаторов сеанса без необходимости. Немедленное удаление данных сеанса также отключает обнаружение и предотвращение атаки перехвата сеанса.
Я не понимаю, почему эта функция может подразумевать потерянные соединения.
Мы отправляем запрос на сервер, чтобы он изменил SID (init $ _SESSION со старыми значениями и создал файл в местоположении save_file), чтобы он мог отправить cookie клиенту.
Кто-нибудь может объяснить мне, где мы можем потерять сеанс?
Я действительно смущен этим, но я бы понял эту проблему, чтобы исправить это ...
Заранее спасибо всем: D
PS: я также читал документацию по https://www.php.net/manual/fr/function.session-regenerate-id.php, и я не понимаю второй пример:
function my_session_start() {
session_start();
if (isset($_SESSION['destroyed'])) {
if ($_SESSION['destroyed'] < time()-300) {
// Ne devrait pas se produire habituellement. Cela pourrait être une
// attaque ou en raison d'un réseau instable. Supprimez tout l'état
// d'authentification de cette session utilisateurs.
remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
throw(new DestroyedSessionAccessException);
}
if (isset($_SESSION['new_session_id'])) {
// Pas encore complètement expiré. Pourrait être perdu cookie par réseau instable.
// Essayez à nouveau de définir le cookie d'ID de session approprié.
// Remarque: n'essayez pas de redéfinir l'ID de session si vous
// souhaitez supprimer l'état d'authentification.
session_commit();
session_id($_SESSION['new_session_id']);
// Nouvel ID de session doit exister
session_start();
return;
}
}
}
почему, если "time () - 300", это может быть атака?
а также я не понимаю, почему мы должны удалить сеанс, если это может быть проблема с сетью ... Это приведет к потере соединения нет? Я не понимаю, почему мы должны поднять исключение? Кто-нибудь может мне помочь?