El manejo de sesiones es el corazón de la autenticación. Si no se configura bien, tu sitio es vulnerable al secuestro de cuentas.
Solución Rápida (Code Snippet)
Usa esta configuración al inicio de tu proyecto (antes de cualquier salida de texto) para blindar tus sesiones.
<?php
// Configuración de cookies seguras
session_start([
'cookie_lifetime' => 0, // La sesión expira al cerrar el navegador
'cookie_httponly' => true, // Protege contra XSS
'cookie_secure' => true, // Solo enviar por HTTPS
'cookie_samesite' => 'Strict', // Protege contra CSRF
'use_only_cookies' => true,
'use_strict_mode' => true
]);
// Regenerar ID para evitar fijación de sesión
if (!isset($_SESSION['last_regeneration'])) {
session_regenerate_id(true);
$_SESSION['last_regeneration'] = time();
} else {
$interval = 60 * 30; // 30 minutos
if (time() - $_SESSION['last_regeneration'] >= $interval) {
session_regenerate_id(true);
$_SESSION['last_regeneration'] = time();
}
}
?>
Cómo funciona
Esta configuración ataca los tres vectores de ataque más comunes en sesiones:
cookie_httponly: Bloquea el acceso dedocument.cookiedesde JS. Si un atacante logra inyectar un script (XSS), no podrá robar el ID de sesión.session_regenerate_id(true): Cambia la “llave” de la sesión periódicamente. Si alguien interceptó la llave vieja, esta dejará de funcionar en minutos.cookie_samesite => 'Strict': Indica al navegador que no envíe la cookie de sesión si la petición viene de un sitio externo, mitigando ataques CSRF.
Buenas Prácticas
- HTTPS Obligatorio: Sin SSL,
cookie_securehará que las sesiones no funcionen. - Destruir Sesiones: Al cerrar sesión, usa
session_unset()ysession_destroy()para limpiar el servidor.
Enlaces Internos
- Esta configuración es vital para nuestro Sistema de Login Seguro.
- Si necesitas persistencia a largo plazo, revisa Cómo implementar Recordarme con Cookies Seguras.
Preguntas Frecuentes
¿Por qué mi sesión se cierra sola?
Probablemente el tiempo de vida de la cookie en el servidor (session.gc_maxlifetime) es muy corto o estás usando cookie_lifetime => 0 y cerraste el navegador.
¿Es seguro guardar contraseñas en $_SESSION?
Nunca. Solo guarda identificadores mínimos como el user_id y el username.