Autorización y autenticación en PHP: Guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Autorización y autenticación en PHP: desde lo básico hasta la seguridad



En el desarrollo web moderno, la autenticación (verificación de la identidad del usuario) y la autorización (verificación de permisos de acceso) son mecanismos fundamentales de seguridad. En PHP, estos procesos se implementan mediante el trabajo con sesiones, cookies, hash de contraseñas y tokens. En este artículo, analizaremos todos los aspectos clave necesarios para crear un sistema de inicio de sesión seguro en el sitio educativo pythonlib.ru.



1. Conceptos básicos: autenticación vs autorización



Antes de escribir código, es importante distinguir claramente dos términos:



  • Autenticación — el proceso de verificar que el usuario es quien dice ser (usuario + contraseña, biometría, token).
  • Autorización — determinar qué recursos y acciones están disponibles para un usuario autenticado (roles: administrador, moderador, usuario).


En PHP, la autenticación generalmente se realiza mediante sesiones o JWT, y la autorización mediante la verificación de roles en la base de datos.



2. Hash de contraseñas: nunca almacene contraseñas en texto plano



PHP proporciona funciones integradas para el hash seguro de contraseñas. Use password_hash() y password_verify() — este es el estándar moderno.



// Registro de usuario$password = $_POST['password'];$hashedPassword = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);

// Guardamos $hashedPassword en la BD$sql = "INSERT INTO users (email, password_hash) VALUES (?, ?)";$stmt = $pdo->prepare($sql);$stmt->execute([$_POST['email'], $hashedPassword]);


// Verificación al iniciar sesión$inputPassword = $_POST['password'];$storedHash = $user['password_hash']; // de la BD

if (password_verify($inputPassword, $storedHash)) { // Autenticación exitosa $_SESSION['user_id'] = $user['id'];} else { // Contraseña incorrecta}


3. Gestión de sesiones en PHP



Las sesiones son la forma más común de rastrear usuarios autenticados. PHP genera automáticamente un identificador de sesión único y lo guarda en una cookie.



// Inicio de sesión (siempre al inicio del script)session_start();

// Después de un inicio de sesión exitoso$_SESSION['user_id'] = $user['id'];$_SESSION['user_role'] = $user['role']; // para autorización$_SESSION['logged_in'] = true;

// Verificación de autenticación en páginas protegidasfunction requireAuth() { if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) { header('Location: /login.php'); exit; }}

// Cierre de sesiónsession_destroy();setcookie(session_name(), '', time() - 3600, '/');


4. Seguridad de sesiones: protección contra ataques



Para prevenir el secuestro de sesiones (Session Hijacking) y la fijación de sesiones (Session Fixation), use las siguientes medidas:



  • Regeneración del ID de sesión después del inicio de sesión:


session_regenerate_id(true); // elimina la sesión anterior


  • Verificación de User-Agent e IP (opcional, pero aumenta la seguridad):


$_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];

// En cada solicitudif ($_SESSION['user_agent'] !== $_SERVER['HTTP_USER_AGENT']) { session_destroy(); die('Actividad sospechosa');}


  • Configuración de banderas para la cookie de sesión en php.ini o mediante session_set_cookie_params():


session_set_cookie_params([    'lifetime' => 0,           // hasta cerrar el navegador    'secure' => true,          // solo HTTPS    'httponly' => true,        // no accesible desde JavaScript    'samesite' => 'Strict'     // protección contra CSRF]);session_start();


5. JWT (JSON Web Tokens)

Recommendations