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.inio mediantesession_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)
También en la biblioteca
Migraciones de bases de datos en Java: descripción general de herramientas populares
TypeStack/routing-controllers para TypeScript: guía completa con ejemplos
Valgrind para C++: guía completa con ejemplos prácticos