Я не понимаю, почему session_regenerate_id опасен при низком соединении? - PullRequest
1 голос
/ 04 апреля 2019

Я работаю над безопасностью своего сайта и понимаю, почему 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", это может быть атака? а также я не понимаю, почему мы должны удалить сеанс, если это может быть проблема с сетью ... Это приведет к потере соединения нет? Я не понимаю, почему мы должны поднять исключение? Кто-нибудь может мне помочь?

...