Estamos actualizando el sitio. Durante unos días es posible que veas fallos de diseño o de traducción. La documentación sigue disponible: si una página se ve mal, recárgala más tarde.

Inicio Laravel 10.x Protección CSRF

Protección CSRF

10.x 7 de mar. de 2026

#Introducción

Los ataques de falsificación de solicitudes entre sitios (cross-site request forgeries) son un tipo de exploit malicioso mediante el cual se ejecutan comandos no autorizados en nombre de un usuario autenticado. Afortunadamente, Laravel facilita la protección de su aplicación contra ataques de falsificación de solicitudes entre sitios (CSRF).

#Explicación de la vulnerabilidad

En caso de que no esté familiarizado con las falsificaciones de solicitudes entre sitios, analicemos un ejemplo de cómo se puede explotar esta vulnerabilidad. Imagine que su aplicación tiene una ruta /user/email que acepta una solicitud POST para cambiar la dirección de correo electrónico del usuario autenticado. Lo más probable es que esta ruta espere un campo de entrada email que contenga la dirección de correo electrónico que el usuario desea comenzar a usar.

Sin protección CSRF, un sitio web malicioso podría crear un formulario HTML que apunte a la ruta /user/email de su aplicación y envíe la dirección de correo electrónico del propio usuario malicioso:

<form action="https://your-application.com/user/email" method="POST">
    <input type="email" value="malicious-email@example.com">
</form>

<script>
    document.forms[0].submit();
</script>

Si el sitio web malicioso envía automáticamente el formulario cuando se carga la página, el usuario malicioso solo necesita atraer a un usuario desprevenido de su aplicación para que visite su sitio web y su dirección de correo electrónico será cambiada en su aplicación.

Para evitar esta vulnerabilidad, necesitamos inspeccionar cada solicitud entrante POST, PUT, PATCH o DELETE en busca de un valor secreto de sesión al que la aplicación maliciosa no pueda acceder.

#Prevención de solicitudes CSRF

Laravel genera automáticamente un "token" CSRF para cada sesión de usuario activa gestionada por la aplicación. Este token se usa para verificar que el usuario autenticado es la persona que realmente realiza las solicitudes a la aplicación. Dado que este token se almacena en la sesión del usuario y cambia cada vez que la sesión se regenera, una aplicación maliciosa no puede acceder a él.

El token CSRF de la sesión actual puede accederse a través de la sesión de la solicitud o mediante la función auxiliar csrf_token:

use Illuminate\Http\Request;

Route::get('/token', function (Request $request) {
    $token = $request->session()->token();

    $token = csrf_token();

    // ...
});

Cada vez que defina un formulario HTML "POST", "PUT", "PATCH" o "DELETE" en su aplicación, debe incluir un campo oculto CSRF _token en el formulario para que el middleware de protección CSRF pueda validar la solicitud. Para mayor comodidad, puede usar la directiva Blade @csrf para generar el campo de entrada oculto del token:

<form method="POST" action="/profile">
    @csrf

    <!-- Equivalente a... -->
    <input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>

El middleware App\Http\Middleware\VerifyCsrfToken, que se incluye por defecto en el grupo de middleware web, verificará automáticamente que el token en la entrada de la solicitud coincida con el token almacenado en la sesión. Cuando estos dos tokens coinciden, sabemos que el usuario autenticado es quien está iniciando la solicitud.

#Tokens CSRF y SPAs

Si está construyendo una SPA que utiliza Laravel como backend API, debe consultar la documentación de Laravel Sanctum para obtener información sobre cómo autenticar con su API y protegerse contra vulnerabilidades CSRF.

#Exclusión de URIs de la protección CSRF

A veces puede desear excluir un conjunto de URIs de la protección CSRF. Por ejemplo, si está utilizando Stripe para procesar pagos y utiliza su sistema de webhooks, necesitará excluir la ruta del manejador de webhooks de Stripe de la protección CSRF, ya que Stripe no sabrá qué token CSRF enviar a sus rutas.

Normalmente, debería colocar este tipo de rutas fuera del grupo de middleware web que App\Providers\RouteServiceProvider aplica a todas las rutas en el archivo routes/web.php. Sin embargo, también puede excluir las rutas agregando sus URIs a la propiedad $except del middleware VerifyCsrfToken:

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    /**
     * Las URIs que deben excluirse de la verificación CSRF.
     *
     * @var array
     */
    protected $except = [
        'stripe/*',
        'http://example.com/foo/bar',
        'http://example.com/foo/*',
    ];
}
Примечание

Para mayor comodidad, el middleware CSRF se desactiva automáticamente para todas las rutas al ejecutar pruebas.

#X-CSRF-TOKEN

Además de verificar el token CSRF como un parámetro POST, el middleware App\Http\Middleware\VerifyCsrfToken también verificará el encabezado de solicitud X-CSRF-TOKEN. Por ejemplo, podría almacenar el token en una etiqueta HTML meta:

<meta name="csrf-token" content="{{ csrf_token() }}">

Luego, puede indicar a una biblioteca como jQuery que agregue automáticamente el token a todos los encabezados de solicitud. Esto proporciona una protección CSRF simple y conveniente para sus aplicaciones AJAX que usan tecnología JavaScript heredada:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

#X-XSRF-TOKEN

Laravel almacena el token CSRF actual en una cookie cifrada XSRF-TOKEN que se incluye con cada respuesta generada por el framework. Puede usar el valor de la cookie para establecer el encabezado de solicitud X-XSRF-TOKEN.

Esta cookie se envía principalmente como una conveniencia para el desarrollador, ya que algunos frameworks y bibliotecas JavaScript, como Angular y Axios, colocan automáticamente su valor en el encabezado X-XSRF-TOKEN en solicitudes de mismo origen.

Примечание

Por defecto, el archivo resources/js/bootstrap.js incluye la biblioteca HTTP Axios, que enviará automáticamente el encabezado X-XSRF-TOKEN por usted.