Funções para Sessão
PHP Manual

session_regenerate_id

(PHP 4 >= 4.3.2, PHP 5, PHP 7)

session_regenerate_id Atualiza o id da sessão atual com um novo id gerado

Descrição

bool session_regenerate_id ([ bool $delete_old_session = false ] )

session_regenerate_id() substituirá o id da sessão atual com um novo id e manterá a informação da sessão atual.

Quando session.use_trans_sid estiver habilitada, saídas (output) devem ser iniciadas depois de session_regenerate_id() ser chamada. Caso contrário, o ID da sessão antiga é utilizado.

Aviso

session_regenerate_id pode não trabalhar muito bem em redes instáveis como, por exemplo, mobile e WiFi. Pode ocorrer perda da sessão ao chamar session_regenerate_id.

Os dados de sessões antigas não devem ser destruídos imediatamente; ao invés disso, deve ser usado timestamp para destruir a sessão e controlar o acesso aos dados de sessões antigas. Caso contrário, acessos concorrentes à página podem causar inconsistências, a perda da sessão, ou pode causar uma condição de corrida no navegador do usuário que faz com que vários IDs de sessão sejam criados desnecessariamente. A remoção imediata dos dados de sessão impossibilita a detecção de ataques de roubo de sessão, e também a prevenção.

Parâmetros

delete_old_session

Se o arquivo associado à sessão anterior deve ser excluído ou não. A sessão antiga não deve ser removida se for necessário evitar condições de corrida causadas pela remoção, ou se for necessário detectar/evitar ataques de roubo de sessão.

Valor Retornado

Retorna TRUE em caso de sucesso ou FALSE em caso de falha.

Changelog

Versão Descrição
7.0.0 session_regenerate_id() salva os dados da sessão antiga antes de encerrar.
4.3.3 Desde então, se os cookies de sessão estão ativados, o uso de session_regenerate_id() também enviará um novo cookie de sessão com o novo id de sessão.
5.1.0 Adicionado o parâmetro delete_old_session.

Exemplos

Exemplo #1 Exemplo de session_regenerate_id()

<?php
// NOTA: Este código não é totalmente funcional, mas apenas um exemplo!

session_start();

// Verifica o timestamp para remoção
if (isset($_SESSION['destroyed'])
    && 
$_SESSION['destroyed'] < time() - 300) {
    
// Normalmente não deve acontecer. Isso pode ser um ataque ou então causado por uma rede instável.
    // Remove todos os status de autenticação da sessão deste usuário.
    
remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
    throw(new 
DestroyedSessionAccessException);
}

$old_sessionid session_id();

// Define o timestamp para remoção
$_SESSION['destroyed'] = time(); // A partir do PHP 7.0.0, session_regenerate_id() salva os dados da sessão anterior

// Apenas chamar session_regenerate_id() pode causar a perda da sessão, etc.
// Veja o próximo exemplo.
session_regenerate_id();

// A nova sessão não precisa da flag destroyed
unset($_SESSION['destroyed']);

$new_sessionid session_id();

echo 
"Old Session: $old_sessionid<br />";
echo 
"New Session: $new_sessionid<br />";

print_r($_SESSION);
?>

O módulo de sessão atual não trabalha bem com redes instáveis. O programador deve gerenciar o ID de sessão para evitar a perda da sessão causada por session_regenerate_id.

Exemplo #2 Evitando a perda de sessão causada por session_regenerate_id()

<?php
// NOTA: Este código não é totalmente funcional, mas apenas um exemplo!
// my_session_start() e my_session_regenerate_id() evitam a perda da sessão causada por
// redes instáveis. Além disso, este código pode evitar que a sessão seja
// roubada por atacantes.

function my_session_start() {
    
session_start();
    if (isset(
$_SESSION['destroyed'])) {
       if (
$_SESSION['destroyed'] < time()-300) {
           
// Normalmente não deve acontecer. Isso pode ser um ataque ou então causado por uma rede instável.
           // Remove todos os status de autenticação da sessão deste usuário.
           
remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
           throw(new 
DestroyedSessionAccessException);
       }
       if (isset(
$_SESSION['new_session_id'])) {
           
// Não está completamente expirado ainda. O cookie pode ter sido perdido por causa de uma rede instável.
           // Tenta novamente definir o cookie de ID de sessão.
           // NOTA: Não tente definir o ID de sessão novamente se você quiser remover
           // as flags de autenticação
           
session_commit();
           
session_id($_SESSION['new_session_id']);
           
// O novo ID de sessão deve existir
           
settion_start();
           return;
       }
   }
}

function 
my_session_regenerate_id() {
    
// Um novo ID de sessão é necessário para definir o ID de sessão corretamente
    // quando o ID de sessão não é configurado por causa de instabilidade na rede.
    
$new_session_id session_create_id()
    
$_SESSION['new_session_id'] = $new_session_id;
    
    
// Definie o timestamp para remoção
    
$_SESSION['destroyed'] = time();
    
    
// Escreve e fecha a sessão
    
session_commit();

    
// Inicia a sessão com um novo ID de sessão
    
session_id($new_session_id);
    
ini_set('session.use_strict_mode'0);
    
session_start();
    
ini_set('session.use_strict_mode'1);
    
    
// A nova sessão não precisa destas informações
    
unset($_SESSION['destroyed']);
    unset(
$_SESSION['new_session_id']);
}
?>

Veja Também


Funções para Sessão
PHP Manual