Autorización y autenticación en PHP: desde lo básico hasta la protección
La seguridad de las aplicaciones web comienza con la correcta implementación de la autenticación (verificación de la identidad del usuario) y la autorización (verificación de sus permisos de acceso). En PHP, estos mecanismos se pueden implementar tanto con funciones integradas como utilizando bibliotecas especializadas. En este artículo, analizaremos los conceptos clave, escribiremos ejemplos de código y revisaremos las mejores prácticas de seguridad.
1. Conceptos básicos: autenticación vs autorización
Antes de escribir código, es importante diferenciar claramente los dos términos:
- Autenticación — proceso de verificar que el usuario es quien dice ser (generalmente mediante usuario y contraseña).
- Autorización — proceso de determinar qué recursos o acciones están disponibles para un usuario autenticado (por ejemplo, el rol "admin" o "user").
Los errores en la implementación de cualquiera de estas etapas pueden provocar fugas de datos o acceso no autorizado.
2. Autenticación básica mediante sesiones (PHP nativo)
La forma más común es el uso de sesiones. PHP proporciona el mecanismo integrado $_SESSION. Veamos un ejemplo sencillo.
Paso 1: Formulario de inicio de sesión (login.php)
<?phpsession_start();?><!DOCTYPE html><html><head> <title>Inicio de sesión</title></head><body> <form method="POST" action="login.php"> <label>Usuario:</label> <input type="text" name="username" required> <label>Contraseña:</label> <input type="password" name="password" required> <button type="submit" name="login">Iniciar sesión</button> </form></body></html>Paso 2: Procesamiento del inicio de sesión (mismo login.php)
<?phpsession_start();require_once 'db.php'; // conexión a la BD
if (isset($_POST['login'])) { $username = trim($_POST['username']); $password = $_POST['password'];
// 1. Consulta preparada para protegerse contra inyecciones SQL $stmt = $pdo->prepare("SELECT id, password_hash FROM users WHERE username = ?"); $stmt->execute([$username]); $user = $stmt->fetch();
// 2. Verificación de la contraseña mediante password_verify if ($user && password_verify($password, $user['password_hash'])) { // Autenticación exitosa $_SESSION['user_id'] = $user['id']; $_SESSION['logged_in'] = true; header("Location: dashboard.php"); exit; } else { $error = "Usuario o contraseña incorrectos"; }}?>Paso 3: Verificación de autorización en una página protegida
<?phpsession_start();if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) { header("Location: login.php"); exit;}// Acceso permitidoecho "Bienvenido, usuario #" . htmlspecialchars($_SESSION['user_id']);?>3. Hash de contraseñas: nunca almacene contraseñas en texto plano
PHP proporciona funciones seguras para trabajar con contraseñas:
password_hash($password, PASSWORD_BCRYPT)— crea un hash con sal automáticamente.password_verify($password, $hash)— verifica la contraseña contra el hash.
Ejemplo de registro de usuario:
<?php$password = "user123";$hash = password_hash($password, PASSWORD_BCRYPT);// Guardamos $hash en la base de datos$stmt = $pdo->prepare("INSERT INTO users (username, password_hash) VALUES (?, ?)");$stmt->execute([$username, $hash]);?>Importante: nunca use md5() o sha1() para contraseñas — están obsoletos y son fáciles de descifrar.
4. Autorización basada en roles (Role-Based Access Control)
Para la diferenciación de permisos
También en la biblioteca
Bean Validation (Jakarta Validation) — Validación de datos en Java
Event Bus y el patrón Observer en C# (.NET): implementación y ejemplos
Tokens JWT en Java: Guía completa para trabajar con JSON Web Tokens
Procesamiento de imágenes en Kotlin: resize y crop con la biblioteca ImageMagick