Saltar al contenido

La seguridad es un pilar fundamental del desarrollo web moderno. Uno de los ataques más comunes y peligrosos es el Cross-Site Request Forgery (CSRF), una técnica en la que un atacante induce al usuario, sin que éste lo note, a realizar acciones no deseadas en una aplicación donde tiene una sesión activa. Desde sus inicios, Laravel ha ofrecido una sólida protección contra estos ataques, y a partir de Laravel 11, es aún más fácil configurar excepciones de forma centralizada.

¿Qué es un ataque CSRF?

Un ataque CSRF ocurre cuando el navegador del usuario, que cuenta con una sesión activa en una aplicación, envía peticiones maliciosas orquestadas por un tercero. Por ejemplo, si el usuario está autenticado en una plataforma de pagos, un atacante podría engañarlo para que visite una página maliciosa que envíe un formulario oculto al sitio legítimo, provocando una acción indeseada (como una transferencia de dinero) sin que el usuario se percate.

Estos ataques se aprovechan de la confianza automática del navegador al enviar cookies de sesión o tokens de autenticación al dominio original. Si la aplicación no cuenta con un mecanismo para verificar que las peticiones provienen del propio usuario de forma legítima, el atacante puede manipular estas acciones a su favor.

La protección CSRF en Laravel

Laravel protege contra CSRF mediante un middleware que se incluye en la capa "web". Todas las rutas que utilizan el middleware "web" quedan protegidas de forma automática. Este middleware verifica que todas las peticiones HTTP de tipo POST, PUT, PATCH o DELETE contengan un token CSRF válido. Si la petición no incluye el token correspondiente, se considera maliciosa y es rechazada.

Para incluir el token, basta con utilizar la directiva @csrf en todos tus formularios Blade:

<form action="/transfer" method="POST">
    @csrf
    <!-- Campos del formulario -->
    <button type="submit">Enviar</button>
</form>

Es imprescindible usar @csrf en todos los formularios que modifiquen datos en tu aplicación. Esto es así independientemente de si el usuario está autenticado o no, ya que cualquier ventana de oportunidad que se abra podría ser aprovechada por un atacante.

Configurando excepciones desde Laravel 11

A partir de Laravel 11, el framework facilita la exclusión de ciertas rutas de la protección CSRF sin necesidad de tocar el middleware directamente. Ahora es posible hacerlo desde el archivo bootstrap/app.php:

$app->withMiddleware(function ($middleware) {
    $middleware->validateCsrfTokens(except: [
        'stripe/*', // Ejemplo: Webhooks de Stripe
        'webhooks/github/*', // Ejemplo: Webhooks entrantes de GitHub

        // Otras rutas que no pueden enviar el token CSRF
    ]);
});

Este enfoque es útil en casos muy específicos, como la recepción de webhooks por parte de servicios externos que no pueden proveer un token CSRF. En dichos casos, deberás implementar otras medidas de seguridad (verificar firmas, tokens secretos, IPs autorizadas, etc.) ya que renuncias a la protección estándar.

Buenas prácticas

  • No omitas @csrf en los formularios: Incluso si tu aplicación no está autenticando usuarios, el token CSRF evita que otros sitios envíen peticiones en tu nombre.

  • Minimiza las excepciones: Excluir rutas de la protección CSRF debe ser la excepción, no la regla. Cada excepción potencialmente abre una puerta a ataques.

  • Implementa medidas adicionales en rutas exentas: Si un webhook de un tercero no puede enviar el token CSRF, garantiza su autenticidad con firmas o tokens propios.

Conclusión

La protección contra CSRF es fundamental para evitar que un atacante convierta la confianza del navegador y la sesión del usuario en una herramienta maliciosa. Laravel, al incluir esta protección en el middleware "web", hace que sea muy sencillo mantener la seguridad sin esfuerzos adicionales. A partir de Laravel 11, además, es aún más fácil gestionar las excepciones para casos puntuales, manteniendo un equilibrio entre seguridad y flexibilidad. Sin embargo, recuerda: siempre debes usar @csrf en tus formularios, y cualquier ruta exenta debe contar con otras defensas para evitar vulnerabilidades.

school Curso completo

Curso Laravel 12
Completo 2026

El único curso 100% actualizado que incluye Laravel 12, Livewire 3, Vue 3, React 19 e Inertia 2. Aprende con proyectos reales y las últimas funcionalidades.

access_time 8 horas de contenido
layers 4 tecnologías en 1
update 100% actualizado
code Proyectos prácticos
Ver Curso Laravel 12 arrow_forward

star Incluido en cualquier suscripción

Rutas de aprendizaje