Autorización y autenticación en PHP: cómo proteger su sitio web
La seguridad es uno de los aspectos clave de cualquier aplicación web. En PHP, la autenticación (verificación de la identidad del usuario) y la autorización (determinación de sus permisos de acceso) se implementan mediante herramientas integradas: sesiones, cookies, hash de contraseñas y trabajo con bases de datos. En este artículo, analizaremos el ciclo completo de creación de un sistema de inicio de sesión, registro y control de acceso en PHP.
1. Conceptos básicos
- Autenticación — proceso de verificar si el usuario es quien dice ser (generalmente mediante nombre de usuario y contraseña).
- Autorización — verificación de si un usuario autenticado tiene derecho a realizar una acción específica (por ejemplo, acceder al panel de administración).
- Sesión — almacenamiento temporal de datos en el servidor, vinculado a un visitante específico mediante un identificador único (ID de sesión).
- Hash de contraseñas — transformación de una contraseña en una cadena irreversible para almacenarla de forma segura en la base de datos.
2. Registro de usuario
El primer paso es crear un formulario de registro y su procesador. La contraseña nunca se almacena en texto plano; usamos la función password_hash().
2.1. Formulario de registro (register.php)
<form method="post" action="register_handler.php"> <input type="text" name="username" placeholder="Usuario" required> <input type="email" name="email" placeholder="Correo electrónico" required> <input type="password" name="password" placeholder="Contraseña" required> <button type="submit">Registrarse</button></form>2.2. Procesador de registro (register_handler.php)
<?php// Conexión a la base de datos (PDO)$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$username = $_POST['username'];$email = $_POST['email'];$password = password_hash($_POST['password'], PASSWORD_BCRYPT); // hasheamos
$stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");$stmt->execute([$username, $email, $password]);
header('Location: login.php');?>Use
PASSWORD_BCRYPT— genera automáticamente un salt y se considera suficientemente seguro.
3. Autenticación (inicio de sesión)
Al iniciar sesión, comparamos la contraseña ingresada con el hash de la base de datos usando password_verify() y creamos una sesión.
3.1. Formulario de inicio de sesión (login.php)
<form method="post" action="login_handler.php"> <input type="text" name="username" placeholder="Usuario" required> <input type="password" name="password" placeholder="Contraseña" required> <button type="submit">Iniciar sesión</button></form>3.2. Procesador de inicio de sesión (login_handler.php)
<?phpsession_start();$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$username = $_POST['username'];$password = $_POST['password'];
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");$stmt->execute([$username]);$user = $stmt->fetch();
if ($user && password_verify($password, $user['password'])) { // Autenticación exitosa $_SESSION['user_id'] = $user['id']; $_SESSION['username'] = $user['username']; $_SESSION['role'] = $user['role']; // para autorización header('Location: dashboard.php');} else { echo "Usuario o contraseña incorrectos";}?>4. Autorización (control de acceso)
Después de la autenticación, el usuario obtiene un rol (por ejemplo, 'user', 'admin', 'moderator'). La autorización verifica este rol antes de realizar acciones.
4.1. Verificación simple de rol
<?phpsession_start();
// Verificamos si el usuario está autenticado También en la biblioteca
Procesamiento de imágenes en Node.js: bibliotecas Sharp, Jimp y gm
Generación de PDF en Swift (iOS/macOS): resumen de herramientas y ejemplos
Procesamiento de JSON en Swift: Codable, JSONSerialization y ejemplos prácticos
CameraX para Kotlin: guía completa con ejemplos prácticos
Criptografía en TypeScript: Resumen de la biblioteca crypto-js