Manejo de Sesiones
Las sesiones permiten mantener datos del usuario entre diferentes páginas, como el contenido de un carrito de compras o el estado de inicio de sesión. En esta lección aprenderás a usar $_SESSION, configurarlas de forma segura y gestionar su ciclo de vida.
Introducción
Una sesión es un mecanismo para almacenar datos en el servidor, asociados a un ID único que se envía al cliente (normalmente vía cookie). PHP usa la superglobal $_SESSION
para gestionar estos datos.
Ejemplo básico:
<?php
declare(strict_types=1);
session_start();
$_SESSION["usuario"] = "Ana";
echo "Sesión iniciada para: " . $_SESSION["usuario"] . "\n";
?>
Iniciar y Usar Sesiones
Para usar sesiones, siempre llama a session_start()
al
inicio de tu script. Esto crea o reanuda una sesión.
<?php
declare(strict_types=1);
session_start();
// Almacenar datos
$_SESSION["nombre"] = "Jorge";
$_SESSION["visitas"] = ($_SESSION["visitas"] ?? 0) + 1;
// Mostrar datos
echo "Hola, " . $_SESSION["nombre"] . "\n";
echo "Has visitado esta página " . $_SESSION["visitas"] . " veces\n";
?>
Notas: - session_start()
debe
ejecutarse antes de cualquier salida (HTML, echo
, etc.). -
Usa (string)
o (int)
para forzar tipos en
$_SESSION
:
<?php
$_SESSION["edad"] = (int)($_SESSION["edad"] ?? 0);
?>
Seguridad en Sesiones
- Regenerar ID: Evita ataques de fijación de sesión
con
session_regenerate_id()
:
<?php
declare(strict_types=1);
session_start();
$_SESSION["autenticado"] = true;
session_regenerate_id(true); // Elimina el ID anterior
?>
- Sanitización: Valida datos antes de guardarlos:
<?php
$nombre = filter_input(INPUT_POST, "nombre", FILTER_SANITIZE_STRING) ?? "";
if ($nombre !== "") {
$_SESSION["nombre"] = $nombre;
}
?>
- XSS: Usa
htmlspecialchars()
al mostrar datos:
<?php
echo htmlspecialchars($_SESSION["nombre"] ?? "", ENT_QUOTES, "UTF-8");
?>
Nota: FILTER_SANITIZE_STRING
está obsoleto desde PHP 8.1 y eliminado en PHP 8.3. Mejor usar FILTER_UNSAFE_RAW junto con htmlspecialchars().
Cerrar Sesiones
Para cerrar una sesión:
<?php
session_start();
$_SESSION = []; // Vaciar datos
session_destroy(); // Destruir sesión
session_unset(); // Opcional: libera variables de sesión
echo "Sesión cerrada\n";
?>
Notas
:- Usa
unset($_SESSION["clave"])
para eliminar una clave específica. - Puedes almacenar cualquier tipo de dato serializable (strings, arrays, objetos...), pero evita guardar grandes cantidades de datos en $_SESSION.
- session_destroy() elimina los datos de la sesión en el servidor, pero la cookie en el navegador puede seguir existiendo hasta que expire o se elimine manualmente.
Configuración de Sesiones
Ajusta la configuración en php.ini
o con
ini_set()
. Por ejemplo, ini_set("session.cookie_secure", "1");
(Solo si usas HTTPS)
<?php
declare(strict_types=1);
ini_set("session.cookie_lifetime", (string)(60 * 60)); // 1 hora
session_start();
?>
Opciones comunes: -
session.cookie_lifetime
: Tiempo de vida de la cookie. -
session.use_strict_mode
: Evita sesiones no inicializadas. -
session.cookie_httponly
: Protege contra XSS.
session.cookie_secure
: Solo envía cookies por HTTPS.
Ejemplo Práctico: Contador de Visitas
Para contar visitas, podemos usar una variable de sesión que se incrementa en cada carga de la página:
<?php
session_start();
$_SESSION["contador"] = ($_SESSION["contador"] ?? 0) + 1;
echo "Visitas: " . $_SESSION["contador"] . "\n";
?>
¿Qué hace esa línea?
- El operador
??
comprueba si$_SESSION["contador"]
existe y no esnull
. - Si no existe, se usa
0
como valor inicial. - Luego se le suma
1
y se asigna el resultado de nuevo a$_SESSION["contador"]
.
Esta forma es compacta y segura. Equivale a:
<?php
if (!isset($_SESSION["contador"])) {
$_SESSION["contador"] = 0;
}
$_SESSION["contador"] += 1;
?>