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.

Exclusión de URI de la protección CSRF en Laravel

#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

Antonio Jenaro

Web Developer

Archivado en:

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