Intereting Posts
Расстояние от точки A до B с помощью Google Maps, PHP и MySQL «Pdo_mysql» отключен, и я не могу включить его. У меня установлен MAMP v. 3.0.4 на моем iMac 7.1 OSX 10.6.8 jQuery / Ajax call – он не работает на IE7 Выполнить валюту из строки Формат байтов в килобайтах, мегабайт, гигабайт Класс Autoload с соглашением об именах на основе Zend или вообще не согласуется с Symfony 2 Как отображать все данные, если пользователь выбирает опцию «Все» Передача переменной PHP в ссылку Html для модальных и AJAX Цветные полоски разных цветов для некоторых конкретных значений в Gnuplot Мой запрос sql для получения значений средней строки с использованием функции GROUP BY Ошибка Json: значение sl_summ типа java.lang.String не может быть преобразовано в JSON OBJECT Невозможно настроить путь php.exe в pear.bat PHP textarea сохраняет дополнительные новые строки в MySQL DB Как использовать миграцию laravel Отправка auth в заголовках php curl

Закройте сеанс и запустите новый

Я тестирую выполнение проверки безопасности на моих сеансах 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(); 

Related of "Закройте сеанс и запустите новый"

Просто вызовите 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()