El ataque no necesita leer la cookie. Solo necesita que el navegador la envíe junto a una request preparada por el atacante.
Texto
víctima autenticada en bank.example
↓ visita evil.example
evil.example dispara POST
↓ navegador añade cookie de bank.example
servidor ejecuta acción como la víctima
CSRF afecta principalmente autenticación basada en cookies u otras credenciales automáticas.
El servidor envía una cookie legible por JavaScript y el cliente repite el valor en un header. El servidor comprueba igualdad, idealmente con token firmado o ligado a session.
Una implementación ingenua puede ser vulnerable a cookie injection desde subdominios. Prefijos host-only y firma mejoran el diseño.
Origin suele estar presente en requests CORS y POST modernos. Referer puede servir como fallback, pero tiene políticas de privacidad. Una ausencia no debe aceptarse automáticamente sin analizar clientes.
Una SPA puede enviar X-CSRF-Token. Un sitio externo no puede añadirlo en una request simple sin preflight. Esto ayuda cuando CORS solo permite origins confiables.
No dependas únicamente de “JSON no es simple”; una mala configuración CORS puede autorizar al atacante.
Un atacante puede hacer que la víctima inicie sesión en la cuenta del atacante, provocando que cargue información sensible allí. Protege login y linking de cuentas, no solo operaciones posteriores.
Tokens por request ofrecen protección adicional, pero complican back/forward y múltiples tabs. Un token aleatorio por session suele ser suficiente para muchas aplicaciones.
Un atacante puede enviar formularios application/x-www-form-urlencoded sin CORS preflight. No asumas que solo aceptas JSON si el parser o proxy tolera otros formatos.
Tokens por session son prácticos; tokens por request son más estrictos pero complican UX. SameSite reduce necesidad, pero arquitecturas cross-site requieren defensa adicional. Origin validation es simple, aunque debe contemplar clientes legítimos.
XSS y salida segura explica cómo contenido no confiable puede convertirse en código en el navegador y por qué el backend también participa en la defensa.