Я тестирую выполнение проверки безопасности на моих сеансах PHP. Я могу успешно определить, был ли сеанс запущен с другого IP-адреса, и я могу успешно начать новый сеанс. Однако данные из старого сеанса копируются в новый! Как я могу начать пустой сеанс, сохранив предыдущие данные сеанса для его законного владельца?
Это мой код до сих пор, после множества неудачных попыток:
<?php // Security check if( isset($_SESSION['ip_address']) && $_SERVER['REMOTE_ADDR']!=$_SESSION['ip_address'] ){ // Check failed: we'll start a brand new session session_regenerate_id(FALSE); $tmp = session_id(); session_write_close(); unset($_SESSION); session_id($tmp); session_start(); } // First time here if( !isset($_SESSION['ip_address']) ){ $_SESSION['ip_address'] = $_SERVER['REMOTE_ADDR']; $_SESSION['start_date'] = new DateTime; }
Официальная документация о сеансах ужасно запутанна 🙁
Обновление: я публикую некоторые выводы, которые я получил через пробную версию и ошибку. Они, похоже, работают:
<?php // Load the session that we will eventually discard session_start(); // We can only generate a new ID from an open session session_regenerate_id(); // We store the ID because it gets lost when closing the session $tmp = session_id(); // Close session (doesn't destroy data: $_SESSION and file remains) session_destroy(); // Set new ID for the next session session_id($tmp); unset($tmp); // Start session (uses new ID, removes values from $_SESSION and loads the new ones if applicable) session_start();
с<?php // Load the session that we will eventually discard session_start(); // We can only generate a new ID from an open session session_regenerate_id(); // We store the ID because it gets lost when closing the session $tmp = session_id(); // Close session (doesn't destroy data: $_SESSION and file remains) session_destroy(); // Set new ID for the next session session_id($tmp); unset($tmp); // Start session (uses new ID, removes values from $_SESSION and loads the new ones if applicable) session_start();
Просто вызовите session_unset
после session_regenerate_id
чтобы сбросить $_SESSION
для текущего сеанса:
if (isset($_SESSION['ip_address']) && $_SERVER['REMOTE_ADDR']!=$_SESSION['ip_address']) { // Check failed: we'll start a brand new session session_regenerate_id(FALSE); session_unset(); }
когда новый пользователь подключается к вашему серверу, сценарий должен иметь доступ только к этим переменным сеанса пользователя. вы захотите сохранить другую информацию в хэшей переменной сеанса, чтобы убедиться, что сеанс не подключен. если он поджат, нет причин для начала нового сеанса, возможно, просто выйдите из сценария с предупреждением.
вот функция, которую многие люди используют для снятия отпечатка пальца сессии:
function fingerprint() { $fingerprint = $server_secure_word; $fingerprint .= $_SERVER['HTTP_USER_AGENT']; $blocks = explode('.', $_SERVER['REMOTE_ADDR']); for ($i=0; $i<$ip_blocks; $i++) { $fingerprint .= $blocks[$i] . '.'; } return md5($fingerprint); }
Использовать это
unset($_SESSION['ip_address'])
вместо `unset ($ _ session) 'Вы также можете использовать session_destroy.
session_destroy
уничтожит данные сеанса. Например,
session_start(); $_SESSION["test"] = "test"; session_write_close(); session_start(); // now session is write to the session file // call session_destroy() will destroy all session data in the file. session_destroy(); // However the you can still access to $_SESSION here print_r($_SESSION); // But once you start the session again session_start(); // all session data is gone as the session file is now empty print_r($_SESSION);
выйдет
array([test] => "test")array()