W3docs

Sesiones en PHP: Una guía completa

Aprende cómo funcionan las sesiones en PHP, cómo almacenar y recuperar datos de sesión, y cómo protegerlas frente a ataques de fijación y secuestro.

HTTP es sin estado: cada solicitud que hace un navegador es independiente y el servidor olvida todo una vez que envía la respuesta. Las sesiones son el mecanismo que usa PHP para recordar a un visitante entre solicitudes: permiten mantener a un usuario autenticado, construir un carrito de compras o recordar preferencias mientras el usuario navega de página en página. Esta guía explica qué son las sesiones, cómo funcionan internamente, cómo leer y escribir datos de sesión, y cómo mantenerlas seguras.

¿Qué son las sesiones en PHP?

Una sesión en PHP es un mecanismo para almacenar datos de cada usuario en el lado del servidor durante el tiempo que dura su visita. A diferencia de las cookies, que guardan datos en el navegador, una sesión conserva los datos reales en el servidor y solo envía al navegador un pequeño ID de sesión para identificar a qué datos pertenece cada usuario.

Esto es importante por dos razones:

  • Capacidad — las cookies están limitadas a unos 4 KB y residen en el navegador; los datos de sesión viven en el almacenamiento del servidor (archivos, una base de datos o memoria) y pueden ser mucho mayores.
  • Seguridad — los valores sensibles (el ID de usuario, su rol o el contenido del carrito) nunca salen del servidor, por lo que el navegador no puede leerlos ni manipularlos. Solo se expone el ID de sesión opaco.

¿Cómo funcionan las sesiones en PHP?

Cuando se inicia una sesión, PHP genera un ID de sesión único para el visitante y lo envía al navegador en una cookie llamada PHPSESSID. En cada solicitud posterior, el navegador devuelve esa cookie y PHP utiliza el ID para buscar los datos almacenados en el servidor. Los datos en sí se exponen a tu código como el array $_SESSION.

Flujo de trabajo de la sesión

graph LR
A[Browser] -- 1. Request + Session Cookie --> B[Server]
B -- 2. Validate Cookie & Fetch Data --> A
A -- 3. Receive Response --> B

En resumen: la cookie transporta el ID; el servidor guarda los datos.

Iniciar una sesión

Cada página que lee o escribe datos de sesión debe llamar a session_start() antes de enviar cualquier salida al navegador. Como session_start() envía la cookie PHPSESSID a través de una cabecera HTTP, incluso un espacio o una línea en blanco antes de la etiqueta de apertura <?php provocará un aviso de "cabeceras ya enviadas" y romperá la sesión.

Llamar a session_start() reanuda la sesión existente del visitante (si su navegador envió un ID válido) o inicia una nueva. Proteger la llamada con session_status() evita un aviso si la sesión ya se había iniciado antes en la misma solicitud:

Cómo iniciar una sesión en PHP

<?php
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

Leer y escribir datos de sesión

Una vez iniciada la sesión, el superglobal $_SESSION se comporta como cualquier otro array asociativo. Asigna un valor a una clave para almacenarlo:

Almacenar datos en una sesión PHP

<?php
$_SESSION['username'] = 'John Doe';
$_SESSION['cart'] = ['book', 'pen'];

Léelos de vuelta en la misma página o en cualquier solicitud posterior dentro de la misma sesión:

Recuperar datos de una sesión PHP

<?php
// Always check the key exists to avoid a warning
$username = $_SESSION['username'] ?? 'Guest';

echo "Welcome, {$username}";

Como los datos persisten entre solicitudes, un patrón habitual es un contador de visitas a la página que sobrevive a las recargas:

Contar visitas a la página en la sesión actual

<?php
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

$_SESSION['views'] = ($_SESSION['views'] ?? 0) + 1;

echo "You have viewed this page {$_SESSION['views']} time(s).";

Para eliminar un valor individual, usa unset() sobre su clave — no asignes null, ya que esto deja la clave en su lugar:

<?php
unset($_SESSION['cart']);

Sesiones vs. Cookies

Las sesiones y las cookies suelen trabajar juntas, pero almacenan los datos en lugares distintos. Usa una sesión cuando los datos sean sensibles o voluminosos; usa una cookie cuando el propio navegador necesite recordar algo (como un token de "recuérdame") entre visitas.

SesiónCookie
Almacenado enServidorNavegador
Visible para el usuarioNo (solo el ID)
Límite de tamañoGrande (almacenamiento del servidor)~4 KB
DuraciónHasta que se cierre el navegador o expireExpiración configurable

Asegurar las sesiones en PHP

Es importante proteger las sesiones en PHP para evitar el acceso no autorizado a datos sensibles del usuario. Puedes asegurar tus sesiones de varias maneras:

  • Regenerar el ID de sesión periódicamente.
  • Almacenar los datos de sesión en el servidor en un directorio seguro.
  • Usar HTTPS para proteger la transmisión de los datos de sesión.

Regenerar el ID de sesión y reforzar la cookie

Las opciones de refuerzo deben establecerse antes de session_start(), de lo contrario la cookie ya habrá sido enviada con la configuración anterior. Regenerar el ID justo después de un cambio de privilegio (como un inicio de sesión) neutraliza los ataques de fijación de sesión, donde un atacante engaña a la víctima para que use un ID de sesión que el atacante ya conoce:

<?php
// Configure before the session starts
ini_set('session.cookie_secure', '1');   // send cookie over HTTPS only
ini_set('session.use_only_cookies', '1'); // never accept the ID from the URL
ini_set('session.cookie_httponly', '1');  // hide the cookie from JavaScript

session_start();

// After a successful login, swap the ID and discard the old one
session_regenerate_id(true);
ConfiguraciónLo que previene
cookie_secureQue el ID de sesión se filtre por HTTP sin cifrar
cookie_httponlyQue JavaScript (XSS) robe la cookie
use_only_cookiesQue los IDs de sesión se pasen en URLs
session_regenerate_idLa fijación de sesión tras un inicio de sesión

Terminar una sesión en PHP

Para cerrar la sesión de un usuario, limpia los datos y destruye la sesión. Vaciar $_SESSION elimina las variables; session_destroy() descarta los datos en el servidor; y eliminar la cookie impide que el navegador envíe el ID obsoleto:

<?php
session_start();

// 1. Clear all session variables
$_SESSION = [];

// 2. Delete the session cookie in the browser
if (ini_get('session.use_cookies')) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
}

// 3. Destroy the data stored on the server
session_destroy();

Conclusión

En conclusión, las sesiones en PHP son una herramienta esencial para almacenar datos del usuario en el lado del servidor y mejorar la experiencia de usuario en tu sitio web. Comprender cómo funcionan y cómo utilizarlas te permite aprovechar al máximo los beneficios que ofrecen. Con las medidas de seguridad adecuadas, también puedes garantizar que los datos sensibles de los usuarios estén protegidos.

Práctica

Práctica
¿Qué se puede lograr usando sesiones en PHP?
¿Qué se puede lograr usando sesiones en PHP?
Was this page helpful?