session_regenerate_id

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

session_regenerate_id Reemplaza el identificador de sesión actual por uno nuevo

Descripción

session_regenerate_id(bool $delete_old_session = false): bool

session_regenerate_id() reemplazará el identificador de sesión actual por uno nuevo, generado automáticamente, manteniendo los valores de sesión.

Cuando la opción session.use_trans_sid está activa, la salida para visualización debe comenzar después de la llamada a la función session_regenerate_id(). De lo contrario, se utilizará el antiguo ID de sesión.

Advertencia

Actualmente, session_regenerate_id no maneja adecuadamente una red inestable. Por ejemplo, redes móviles y WiFi. Por lo tanto, puede encontrarse una pérdida de sesión al llamar a session_regenerate_id.

No se deben destruir los antiguos datos de sesión inmediatamente, sino que se debe utilizar el timestamp de destrucción y controlar el acceso al antiguo ID de sesión. De lo contrario, el acceso simultáneo a la página puede provocar un estado inconsistente, o quizás se haya perdido la sesión, o puede provocar un acceso concurrente lado-cliente (navegador) y puede crear muchos ID de sesión innecesariamente. La eliminación inmediata de datos de sesión también desactiva la detección y prevención de ataques de secuestro de sesión.

Parámetros

delete_old_session

Si se debe borrar el antiguo archivo de sesión asociado o no. No se debe eliminar la antigua sesión si se necesita evitar accesos concurrentes causados por la eliminación o detectar/evitar ataques de secuestro de sesión.

Valores devueltos

Devuelve true en caso de éxito o false en caso de error.

Ejemplos

Ejemplo #1 Ejemplo con session_regenerate_id()

<?php
// Nota: este código no funciona completamente, es un ejemplo!

session_start();

// Verificar el timestamp de destrucción
if (isset($_SESSION['destroyed'])
&&
$_SESSION['destroyed'] < time() - 300) {
// No debería ocurrir habitualmente. Esto podría ser una ataque
// o debido a una red inestable. Elimine todo el estado de
// autenticación de esta sesión de usuario.
remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
throw(new
DestroyedSessionAccessException);
}

$old_sessionid = session_id();

// Definir el timestamp de destrucción
$_SESSION['destroyed'] = time(); // session_regenerate_id () registra los antiguos datos de sesión

// Simplemente llamar a session_regenerate_id() puede provocar pérdida de sesión, etc.
// Ver el ejemplo siguiente.
session_regenerate_id();

// La nueva sesión no necesita el timestamp de destrucción
unset($_SESSION['destroyed']);

$new_sessionid = session_id();

echo
"Sesión antigua: $old_sessionid<br />";
echo
"Sesión nueva: $new_sessionid<br />";

print_r($_SESSION);
?>

El módulo de sesión actual no maneja adecuadamente una red inestable. Se debe gestionar el ID de sesión para evitar la pérdida de sesión por session_regenerate_id.

Ejemplo #2 Evitar la pérdida de sesión por session_regenerate_id()

<?php
// Nota: este código no funciona completamente, es un ejemplo!
// my_session_start() y my_session_regenerate_id() evitan sesiones perdidas
// por red inestable. Además, este código puede evitar la explotación de
// sesión robada por atacantes.

function my_session_start() {
session_start();
if (isset(
$_SESSION['destroyed'])) {
if (
$_SESSION['destroyed'] < time()-300) {
// No debería ocurrir habitualmente. Esto podría ser una
// ataque o debido a una red inestable. Elimine todo el estado
// de autenticación de esta sesión de usuario.
remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
throw(new
DestroyedSessionAccessException);
}
if (isset(
$_SESSION['new_session_id'])) {
// No ha expirado completamente. Podría ser pérdida de cookie por red inestable.
// Intente nuevamente definir la cookie de ID de sesión adecuada.
// Nota: no intente redefinir el ID de sesión si
// desea eliminar el estado de autenticación.
session_commit();
session_id($_SESSION['new_session_id']);
// El nuevo ID de sesión debe existir
session_start();
return;
}
}
}

function
my_session_regenerate_id() {
// El nuevo ID de sesión es requerido para definir el ID de sesión adecuado
// cuando el ID de sesión no está definido debido a una red inestable.
$new_session_id = session_create_id();
$_SESSION['new_session_id'] = $new_session_id;

// Define el timestamp de destrucción
$_SESSION['destroyed'] = time();

// Escribe y cierra la sesión actual
session_commit();

// Inicia la sesión con un nuevo ID
session_id($new_session_id);
ini_set('session.use_strict_mode', 0);
session_start();
ini_set('session.use_strict_mode', 1);

// La nueva sesión no lo necesita
unset($_SESSION['destroyed']);
unset(
$_SESSION['new_session_id']);
}
?>

Ver también