Seguridad Web: Guía Definitiva de Vulnerabilidades OWASP
Cómo defender tus aplicaciones contra SQL Injection, Cross-Site Scripting (XSS), CSRF y fallas de control de acceso en producción.
OWASP (Open Web Application Security Project) es una fundación global sin fines de lucro dedicada a mejorar la seguridad del software en todo el mundo. Su publicación más respetada es el **OWASP Top 10**: un informe de consenso internacional elaborado por los mejores expertos en seguridad que describe las 10 vulnerabilidades más críticas y frecuentes que afectan a las aplicaciones web modernas. La inmensa mayoría de las brechas de seguridad millonarias que aparecen en las noticias no son causadas por sofisticados ataques de agencias de inteligencia, sino por errores básicos de programación como no sanitizar una entrada de texto, permitir la ejecución de scripts no autorizados o confiar ciegamente en los datos que envía el navegador del usuario.
- ✓Inyección SQL (SQLi): Ocurre cuando un atacante introduce código SQL malicioso en un formulario y el servidor lo ejecuta directamente, permitiéndole robar o borrar la base de datos completa.
- ✓Cross-Site Scripting (XSS): El atacante logra inyectar código JavaScript malicioso en una página web vista por otros usuarios, robando sus cookies de sesión y contraseñas.
- ✓Fallas en el Control de Acceso (Broken Access Control / IDOR): Ocurre cuando el servidor no valida si el usuario logueado realmente tiene permiso para ver el registro `/factura/105` del vecino.
- •Protege la información confidencial (tarjetas de crédito, contraseñas, historiales médicos) de tus usuarios.
- •Evita multas regulatorias devastadoras (como las impuestas por GDPR o normativas bancarias).
- •Mantiene la reputación comercial de la empresa evitando el secuestro de cuentas de usuarios.
- **SQL Injection es un Cheque Alterado**: Le entregas un cheque al banco que dice: *'Páguese a Juan 100 dólares'*, pero el ladrón escribe al lado: *'... y además transfiera todos los ahorros del banco a mi cuenta personal'*. Si el cajero es ingenuo y lee toda la frase sin verificar, ejecuta la orden del ladrón. - **XSS es un Micrófono Oculto en el Salón**: Un atacante pega un micrófono espía con cinta adhesiva debajo de la mesa de conferencias. Cuando el Director General se sienta a hablar de secretos comerciales, el micrófono transmite todo en directo al atacante. - **IDOR (Control de Acceso Roto) es un Casillero de Gimnasio sin Llave**: En el gimnasio te asignan el casillero #12. Pero tú caminas por el pasillo, abres el casillero #13 y el gimnasio te permite sacar la billetera de otra persona sin pedirte identificación.
Explicación Paso a Paso del Tema
Cómo Prevenir Inyecciones SQL con Consultas Parametrizadas
Nunca jamás concatenes cadenas de texto para armar sentencias SQL.
Utiliza siempre sentencias preparadas (Prepared Statements) con marcadores de posición (`$1`, `?`).
// CÓDIGO VULNERABLE (¡PELIGRO DE INYECCIÓN SQL!):
// const query = `SELECT * FROM users WHERE email = '${req.body.email}'`;
// CÓDIGO SEGURO Y BLINDADO (Consultas Parametrizadas):
const query = 'SELECT id, email, role FROM users WHERE email = $1 AND active = true';
const values = [req.body.email];
const result = await db.query(query, values);| Parámetro / Flag | Tipo / Rol | Significado y Uso |
|---|---|---|
| $1 | Marcador de Posición | Indica al motor SQL que trate el valor como un dato crudo literal, nunca como comando ejecutable. |
| values | Arreglo Seguro | Pasa los datos del usuario en un canal independiente del comando SQL. |
Los ORMs modernos como Prisma o Hibernate utilizan parámetros de forma nativa por debajo, protegiéndote automáticamente.
Cómo Prevenir Cross-Site Scripting (XSS)
XSS ocurre cuando imprimes texto de usuarios directamente en el DOM HTML sin escapar caracteres especiales como `<script>` o `onerror`.
Frameworks modernos como React escapan automáticamente las cadenas de texto (`{user.comment}`). Si usas HTML crudo, sanitiza siempre con librerías como DOMPurify.
// En el frontend, sanitizar antes de renderizar HTML dinámico: import DOMPurify from 'dompurify'; const rawHtml = userGeneratedContent; const cleanHtml = DOMPurify.sanitize(rawHtml); // Ahora es seguro usar cleanHtml sin riesgo de ejecución de JavaScript malicioso
| Parámetro / Flag | Tipo / Rol | Significado y Uso |
|---|---|---|
| DOMPurify.sanitize | Función | Elimina etiquetas <script>, eventos inline (onload, onerror) y protocolos peligrosos como javascript:. |
Guardar tokens JWT de sesión en `localStorage`: cualquier vulnerabilidad XSS en tu sitio permitirá que el script malicioso robe el token con `localStorage.getItem('token')`. Usa siempre cookies `HttpOnly`.
Configurar Cabeceras de Seguridad HTTP Esenciales
Utiliza librerías como `helmet` en Node.js o directivas de Nginx para enviar cabeceras que blindan el navegador del cliente.
La cabecera **Content Security Policy (CSP)** restringe qué scripts y orígenes pueden ejecutarse en la web.
import helmet from 'helmet'; import express from 'express'; const app = express(); // Activa automáticamente 15 cabeceras de seguridad HTTP esenciales app.use(helmet());
| Parámetro / Flag | Tipo / Rol | Significado y Uso |
|---|---|---|
| helmet() | Middleware | Inyecta X-Content-Type-Options, X-Frame-Options (anti-clickjacking), HSTS y Content-Security-Policy. |
Configura `X-Frame-Options: DENY` para evitar que atacantes incrusten tu sitio bancario dentro de un iframe invisible para engañar al usuario (Clickjacking).
Casos Prácticos Reales en Producción
Situaciones de ingeniería reales sin mención de presupuestos ficticios.
1El Robo de Cuentas por IDOR en un Portal de Salud
Una aplicación médica permitía descargar radiografías mediante la URL `/api/paciente/7504/estudios.pdf`. Un usuario cambió el número a `7505` en la barra de direcciones y pudo descargar el historial médico confidencial de otra persona.
Se implementó una validación estricta de autorización en el controlador: el backend ahora verifica que el `req.user.id` del token JWT coincida obligatoriamente con el paciente solicitado antes de leer el archivo.
Fichas Nemotécnicas de Conceptos Clave
Glosario rápido para recordar los términos fundamentales de la lección.
Vulnerabilidad donde comandos SQL maliciosos son inyectados en campos de entrada y ejecutados por la base de datos.
Falla de seguridad que permite a un atacante inyectar scripts del lado del cliente en páginas web vistas por otros usuarios.
Cabecera HTTP que permite a los propietarios de un sitio web declarar qué fuentes de scripts e imágenes tienen permiso de ejecutarse.
Seguridad Web: Guía Definitiva de Vulnerabilidades OWASP
Selecciona una opción para autoevaluarte al instante. La respuesta se califica de inmediato.
¿Cuál es la técnica universalmente recomendada para prevenir ataques de Inyección SQL en aplicaciones web?
¿Por qué almacenar tokens JWT de sesión en 'localStorage' es un riesgo de seguridad frente a ataques XSS?
¿Qué es la vulnerabilidad conocida como IDOR (Insecure Direct Object References)?
Preguntas Frecuentes (FAQ)
¿Qué es CSRF (Cross-Site Request Forgery) y cómo se previene?
CSRF engaña al navegador de un usuario autenticado para que ejecute una acción involuntaria en un sitio web de confianza (ej. transferir dinero al visitar una web maliciosa). Se previene utilizando tokens CSRF criptográficos únicos por formulario y configurando la directiva `SameSite=Strict` o `Lax` en las cookies de sesión.
¿Un WAF (Web Application Firewall) elimina la necesidad de escribir código seguro?
No. Un WAF (como Cloudflare o AWS WAF) es una excelente capa de defensa en profundidad para bloquear patrones de ataque conocidos en el borde perimetral, pero nunca reemplaza las buenas prácticas de validación y control de acceso en el código fuente de tu aplicación.