Csfr Protection
CSFR protection
Las falsificaciones de solicitudes entre sitios son un tipo de explotación maliciosa mediante la cual se ejecutan comandos no autorizados en nombre de un usuario autenticado. Afortunadamente, Laravel facilita la protección de tu aplicación contra los ataques de falsificación de solicitudes entre sitios (CSRF).
Como funciona?
En caso de que no estés familiarizado con las falsificaciones de solicitudes entre sitios (CSRF), vamos a discutir 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. Lo más probable es que esta ruta espere un campo de entrada de correo electrónico que contenga la dirección de correo electrónico que el usuario desee 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 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 tu aplicación a visitar su sitio web y su dirección de correo electrónico será cambiada en tu aplicación.
Para prevenir esta vulnerabilidad, necesitamos inspeccionar cada solicitud entrante de tipo POST, PUT, PATCH o DELETE en busca de un valor secreto de sesión al que la aplicación maliciosa no pueda acceder.
Preventing CSRF Requests
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 está haciendo 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 helper 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 con método “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. Para mayor comodidad, puedes usar la directiva @csrf de Blade para generar el campo de entrada del token oculto:
<form method="POST" action="/profile">
@csrf
<!-- Equivalent to... -->
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
El middleware Illuminate\Foundation\Http\Middleware\ValidateCsrfToken, que está incluido 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á enviando la solicitud.
Si estás construyendo una SPA que utiliza Laravel como un backend de API, deberías consultar la documentación de Laravel Sanctum para obtener información sobre la autenticación con tu API y la protección contra vulnerabilidades CSRF.
Excluding URIs From CSRF Protection
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, necesitarás excluir la ruta del manejador de webhook de Stripe de la protección CSRF, ya que Stripe no sabrá qué token CSRF enviar a tus rutas.
Normalmente, deberías colocar este tipo de rutas fuera del grupo de middleware web que Laravel aplica a todas las rutas en el archivo routes/web.php. Sin embargo, también puedes excluir rutas específicas proporcionando sus URIs al método validateCsrfTokens en el archivo bootstrap/app.php de tu aplicación:
->withMiddleware(function (Middleware $middleware) {
$middleware->validateCsrfTokens(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 cuando se ejecutan tests.
X-CSRF-TOKEN
Además de verificar el token CSRF como un parámetro POST, el middleware Illuminate\Foundation\Http\Middleware\ValidateCsrfToken, que está incluido por defecto en el grupo de middleware web, 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 instruir a una biblioteca como jQuery para que automáticamente agregue el token a todos los encabezados de las solicitudes. 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')
}
});
X-XSRF-TOKEN
Laravel almacena el token CSRF actual en una cookie cifrada llamada XSRF-TOKEN, que se incluye en cada respuesta generada por el framework. Puedes utilizar el valor de esta cookie para establecer el encabezado de solicitud X-XSRF-TOKEN.
Esta cookie se envía principalmente como una conveniencia para los desarrolladores, ya que algunos frameworks y bibliotecas de JavaScript, como Angular y Axios, automáticamente colocan su valor en el encabezado X-XSRF-TOKEN en las solicitudes del mismo origen.
🔆 Por defecto, el archivo resources/js/bootstrap.js de Laravel incluye la biblioteca HTTP Axios, que automáticamente enviará el encabezado X-XSRF-TOKEN por ti.