Exclusión de URI de la protección CSRF en Laravel
- Publicado el 09 septiembre, 2024
- Palabras: 693
La protección CSRF (falsificación de solicitud entre sitios) incorporada de Laravel es una característica de seguridad crucial que ayuda a proteger sus aplicaciones web. Sin embargo, existen situaciones en las que es posible que deba excluir ciertas URI de esta protección, como al manejar webhooks o devoluciones de llamadas de terceros. Exploremos cómo administrar de manera efectiva las excepciones CSRF en Laravel y, al mismo tiempo, mantener una seguridad sólida.
#Entendiendo la protección CSRF
Antes de profundizar en las exclusiones, es importante comprender por qué la protección CSRF es fundamental:
- Evita que se transmitan comandos no autorizados desde un usuario en el que la aplicación web confía.
- Laravel genera automáticamente tokens CSRF para cada sesión de usuario activa.
- Estos tokens se validan en solicitudes posteriores para proteger contra falsificaciones de solicitudes entre sitios.
#El Middleware VerifyCsrfToken
Laravel utiliza el middleware VerifyCsrfToken para gestionar la protección CSRF. Este middleware es donde definiremos nuestras excepciones.
#Exclusión de una URI de la protección CSRF
Para excluir una URI específica, deberás modificar la propiedad $except en el middleware VerifyCsrfToken:
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'stripe/*',
'webhook/*',
];
}
En este ejemplo, cualquier URI que comience con stripe/ o webhook/ quedará excluido de la protección CSRF.
#Ejemplo práctico: manejo de un webhook de Stripe
Consideremos un ejemplo práctico de manejo de un webhook de Stripe:
// In App\Http\Middleware\VerifyCsrfToken.php
protected $except = [
'stripe/webhook',
];
// In routes/web.php
Route::post('stripe/webhook', 'StripeWebhookController@handleWebhook');
// In App\Http\Controllers\StripeWebhookController.php
public function handleWebhook(Request $request)
{
// Verify the webhook signature
$payload = $request->getContent();
$sig_header = $request->header('Stripe-Signature');
$event = null;
try {
$event = \Stripe\Webhook::constructEvent(
$payload, $sig_header, config('services.stripe.webhook_secret')
);
} catch(\UnexpectedValueException $e) {
return response()->json(['error' => 'Invalid payload'], 400);
} catch(\Stripe\Exception\SignatureVerificationException $e) {
return response()->json(['error' => 'Invalid signature'], 400);
}
// Handle the event
switch ($event->type) {
case 'payment_intent.succeeded':
$paymentIntent = $event->data->object;
handleSuccessfulPayment($paymentIntent);
break;
// ... handle other event types
default:
return response()->json(['error' => 'Unexpected event type'], 400);
}
return response()->json(['status' => 'success']);
}
En este ejemplo, excluimos la URI del webhook de Stripe de la protección CSRF, pero implementamos la verificación de firma de Stripe como medida de seguridad alternativa.
#Pruebas automatizadas de exclusiones CSRF
Al testear rutas que están excluidas de la protección CSRF, no es necesario incluir el token CSRF:
public function testStripeWebhook()
{
$payload = [
'type' => 'payment_intent.succeeded',
'data' => [
'object' => [
'id' => 'pi_123456',
'amount' => 1000,
'currency' => 'usd',
],
],
];
$response = $this->postJson('/stripe/webhook', $payload, [
'Stripe-Signature' => 'test_signature',
]);
$response->assertStatus(200);
// Additional assertions...
}
#Conclusion
Excluir las URL de la protección CSRF en Laravel es una característica poderosa que permite flexibilidad en el manejo de escenarios específicos como webhooks. Sin embargo, es fundamental usar esta característica con prudencia e implementar medidas de seguridad alternativas cuando sea necesario. Si sigue las mejores prácticas y comprende las implicaciones de las exclusiones CSRF, puede mantener una aplicación Laravel segura y flexible.
Antonio Jenaro
Web Developer
Fuente: Harris Raftopoulos
Inicia la conversación
Hazte miembro de Antonio Jenaro para comenzar a comentar.
Regístrate ahora¿Ya estás registrado? Inicia sesión