Defensa contra CSRF y SSRF
Dos falsificaciones de petición distintas y cómo mitigar cada una.
CSRF y SSRF suenan parecido pero son ataques opuestos. En CSRF el navegador de la víctima hace una petición no deseada a tu servidor. En SSRF es tu servidor el engañado para pedir a un destino que el atacante elige.
CSRF — Cross-Site Request Forgery
El atacante hace que el navegador del usuario envíe una petición autenticada (usando su cookie) sin que lo sepa.
1. Tokens anti-CSRF
Incluye un token impredecible, ligado a la sesión, en cada formulario o petición que modifique estado. El servidor lo verifica.
// El token va en un campo oculto / cabecera y se valida en el servidor
if (req.body.csrfToken !== req.session.csrfToken) return res.sendStatus(403);
2. Cookies SameSite
SameSite=Lax (o Strict) impide que la cookie viaje en peticiones cross-site, cortando la
mayoría de CSRF de raíz. Úsalo junto con tokens, no en lugar de ellos.
3. Verifica el origen
Comprueba las cabeceras Origin/Referer en peticiones que cambian estado.
SSRF — Server-Side Request Forgery
Ocurre cuando tu servidor hace una petición HTTP a una URL que controla el usuario (webhooks, importar desde URL, miniaturas). El atacante apunta a servicios internos o a metadatos del cloud.
1. Allow-list de destinos
// MAL — el servidor pide a cualquier URL que mande el usuario
const data = await fetch(req.body.url);
// BIEN — solo dominios explícitamente permitidos
const DOMINIOS = new Set(['api.proveedor.com', 'cdn.proveedor.com']);
const url = new URL(req.body.url);
if (!DOMINIOS.has(url.hostname)) throw new Error('Destino no permitido');
2. Bloquea rangos internos
Prohíbe IPs privadas y de loopback: 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12,
192.168.0.0/16 y, crucial en cloud, el endpoint de metadatos 169.254.169.254. Resuelve el DNS
y valida la IP final para evitar DNS rebinding.
3. Capa de red
Aísla por red el servicio que hace peticiones salientes y restringe su egreso con un firewall.
Checklist rápida
- Tokens anti-CSRF en toda operación que cambia estado.
- Cookies con
SameSite=Lax/Strict. - Validación de
Origin/Referer. - Allow-list de dominios para peticiones salientes del servidor.
- Bloqueo de IPs internas, loopback y metadatos del cloud (169.254.169.254).
- Validación de la IP resuelta (anti DNS rebinding) y egreso restringido por firewall.
- #csrf
- #ssrf
- #owasp