Чтобы избежать фиксации сеанса, я использую этот код в начале каждой страницы PHP:
session_set_cookie_params( 900, '/', $domain, 1, 1 ); session_start(); session_regenerate_id( true );
Но если страница обновляется слишком быстро или в случае нескольких аякс-запросов, идентификатор сеанса становится недействительным.
Есть ли способ избежать фиксации сеанса без этой проблемы?
Используйте флаг http_only cookie, который предотвратит захват вашего идентификатора сеанса с помощью атак xss. Он поддерживается практически во всех современных браузерах. Для старых браузеров убедитесь, что у вас нет уязвимости xss в вашем коде. Также используйте безопасный флаг, если это возможно, для его защиты на сетевом уровне.
void session_set_cookie_params ( int $lifetime [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]] )
Вы также можете регенерировать по времени или рассчитывать. Надеюсь, поможет!
Ниже приведен пример того, как восстанавливать только идентификатор сеанса каждые 5 минут:
// Sets the session name to the one set above. session_name($session_name); // Start the PHP session session_start(); // Set last regen session variable first time if (!isset($_SESSION['last_regen'])) { $_SESSION['last_regen'] = time(); } // Set session regeneration time in seconds $session_regen_time = 60*5; // Only regenerate session id if last_regen is older than the given regen time. if ($_SESSION['last_regen'] + $session_regen_time < time()){ $_SESSION['last_regen'] = time(); session_regenerate_id(true); }