Fechar session e começar uma nova

Estou testando a implementação de uma verificação de segurança em minhas sessões PHP. Posso detectar com sucesso se a session foi iniciada a partir de outro endereço IP e posso iniciar com êxito uma nova session. No entanto, os dados da session anterior são copiados para o novo! Como posso iniciar uma session em branco, preservando os dados da session anterior para o proprietário legítimo?

Este é o meu código até agora, depois de muitas tentativas falhadas:

<?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; } 

A documentação oficial sobre sessões é terrivelmente confusa 🙁

Atualização: estou publicando algumas descobertas que experimentei tentativa e erro. Parecem funcionar:

 <?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(); 

Basta chamar session_unset após session_regenerate_id para reiniciar $_SESSION para a session atual:

 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(); } 

Quando um novo usuário se conecta ao seu servidor, o script só pode acessar as variables ​​de session desse usuário. você deseja armazenar outras informações em uma variável de session hash para verificar se a session não está sendo aumentada. se está sendo carregado, sem motivo para iniciar uma nova session, talvez apenas saia do script com um aviso.

Aqui está a function que muitas pessoas usam para a impressão digital de uma session:

 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); } 

Usa isto

 unset($_SESSION['ip_address']) 

em vez de ‘unset ($ _ session)’ Você também pode usar session_destroy.

session_destroy irá destruir os dados da session. Por exemplo,

 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); 

irá produzir

 array([test] => "test")array()