Documentación de Laravel 10.x
Aquí encontrarás fragmentos de código de Laravel y consejos útiles sobre desarrollo web.
Los ataques de falsificación de solicitudes entre sitios (CSRF) son un tipo de explotación maliciosa en la que se realizan comandos no autorizados en nombre de un usuario autenticado. Afortunadamente, Laravel facilita la protección de tu aplicación contra ataques CSRF.
En caso de que no estés familiarizado con las falsificaciones de solicitudes entre sitios, discutamos un ejemplo de cómo se puede explotar esta vulnerabilidad. Imagina que tu aplicación tiene una ruta /user/email
que acepta una solicitud POST
para cambiar la dirección de correo electrónico del usuario autenticado. Es probable que esta ruta espere que un campo de entrada email
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 tu aplicación y envíe la dirección de correo electrónico del usuario malicioso:
<form action="https://your-application.com/user/email" method="POST"></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 tu aplicación a visitar su sitio y su dirección de correo electrónico se cambiará en tu aplicación.
Para evitar esta vulnerabilidad, necesitamos inspeccionar cada solicitud POST
, PUT
, PATCH
o DELETE
entrante en busca de un valor secreto de sesión al que la aplicación maliciosa no puede acceder.
Laravel genera automáticamente un "token" CSRF para cada sesión de usuario activa gestionada por la aplicación. Este token se utiliza 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 se regenera la sesión, una aplicación maliciosa no puede acceder a él.
El token CSRF de la sesión actual se puede acceder 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 definas un formulario HTML "POST", "PUT", "PATCH" o "DELETE" en tu aplicación, debes incluir un campo oculto CSRF _token
en el formulario para que el middleware de protección CSRF pueda validar la solicitud. Por conveniencia, puedes utilizar 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 de forma predeterminada 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.
Si estás construyendo una SPA que utiliza Laravel como backend de la API, debes consultar la documentación de Laravel Sanctum para obtener información sobre la autenticación con tu API y protegerte contra vulnerabilidades CSRF.
A veces, es posible que desees excluir un conjunto de URIs de la protección CSRF. Por ejemplo, si estás utilizando Stripe para procesar pagos y estás utilizando su sistema de webhook, deberás excluir la ruta de tu controlador de webhook de la protección CSRF, ya que Stripe no sabrá qué token CSRF enviar a tus rutas.
Normalmente, debes colocar estas rutas fuera del grupo de middleware web
que el App\Providers\RouteServiceProvider
aplica a todas las rutas en el archivo routes/web.php
. Sin embargo, también puedes 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/*', ];}
Nota Por conveniencia, el middleware CSRF se desactiva automáticamente para todas las rutas al ejecutar pruebas.
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ías almacenar el token en una etiqueta meta
HTML:
<meta name="csrf-token" content="{{ csrf_token() }}">
Luego, puedes 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 tus aplicaciones basadas en AJAX que utilizan tecnología JavaScript heredada:
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }});
Laravel almacena el token CSRF actual en una cookie cifrada XSRF-TOKEN
que se incluye con cada respuesta generada por el framework. Puedes 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 marcos y bibliotecas de JavaScript, como Angular y Axios, colocan automáticamente su valor en el encabezado X-XSRF-TOKEN
en las solicitudes del mismo origen.
Nota De forma predeterminada, el archivo
resources/js/bootstrap.js
incluye la biblioteca HTTP Axios, que enviará automáticamente el encabezadoX-XSRF-TOKEN
por ti.