Introducción
CSRF (Cross-Site Request Forgery) es un ataque que hace enviar solicitudes no deseadas suplantando a un usuario que ya ha iniciado sesión. Por ejemplo, imagina que tu aplicación tiene una rutaPOST /user/email que acepta el cambio de dirección de correo. Si un atacante coloca en otro sitio un formulario que envía automáticamente a esa URL, es posible que se cambie la dirección de correo sin que el usuario se dé cuenta.
En Laravel 13, la protección CSRF está habilitada por defecto gracias al mecanismo incluido en el grupo de middleware web.
Prevención de ataques CSRF
El middlewarePreventRequestForgery de Laravel evita los CSRF con dos capas:
- Validación de Origin (cabecera
Sec-Fetch-Site) - Validación de token (token CSRF por sesión)
Validación de Origin
Laravel comprueba primeroSec-Fetch-Site para decidir si la solicitud proviene del mismo origen. Esto es especialmente útil en entornos HTTPS.
Si la validación de Origin tiene éxito, la solicitud se permite en ese punto. Si no la supera, se ejecuta la validación de token CSRF como hasta ahora.
Modo Origin-only
También puedes desactivar el fallback a la validación de token y decidir únicamente por la validación de Origin.403 en lugar de 419.
Si necesitas permitir solicitudes same-site, por ejemplo entre subdominios, configura allowSameSite.
Validación de token
Laravel genera un token CSRF por cada sesión. Puedes obtenerlo concsrf_token() o desde la sesión.
web, cuando crees formularios POST, PUT, PATCH o DELETE, incluye siempre @csrf.
Exclusión de URI
En solicitudes provenientes de servicios externos, como los webhooks de Stripe, puede que necesites excluir ciertas URI de la protección CSRF.Siempre que sea posible, coloca las rutas de webhook fuera del grupo de middleware
web y reduce al mínimo las exclusiones.Cabecera X-CSRF-TOKEN
Laravel no solo valida el_token del formulario, también la cabecera X-CSRF-TOKEN.
Primero, expón el token en una meta etiqueta.
Cabecera X-XSRF-TOKEN
Laravel también envía una cookieXSRF-TOKEN cifrada. Axios y Angular pueden asignar automáticamente ese valor a la cabecera X-XSRF-TOKEN en solicitudes al mismo origen.
Por eso, en implementaciones SPA o AJAX puede que la protección CSRF quede activa sin necesidad de escribir manualmente la cabecera.