csrf in Laravel für eine bestimmte Route deaktivieren

Lesezeit: 4 Minuten

Ich habe ein Zahlungssystem, bei dem Daten an eine Drittanbieter-Site gesendet und dann zurückgeholt werden…

Wenn Daten zurückgegeben werden, treffen sie auf eine bestimmte URL, sagen wir /ok route. $_REQUEST['transaction'].

Aber wegen der Laravel-Middleware bekomme ich Token-Mismatch. Es gibt keine Möglichkeit, die Zahlungs-API von Drittanbietern Token zu generieren, also wie deaktiviere ich sie? nur für diese Strecke?

oder gibt es eine bessere möglichkeit?

Route::get('/payment/ok',   'TransactionsController@Ok');
Route::get('/payment/fail', 'TransactionsController@Fail');

public function Ok( Request $request )
{
    $transId = $request->get('trans_id');

    if ( isset( $transId ) )
    {

        return $transId;

    }

}

  • laravel.com/docs/master/routing#csrf-exklusive-uris

    – Raschi

    30. Juli ’15 um 16:43

  • Welche Laravel-Version verwendest du? Wenn 5.1, siehe die Antwort unten. Wenn einige älter sind, lassen Sie es mich wissen und ich werde die Antwort aktualisieren, da es für ältere Versionen Möglichkeiten gibt, dies zu tun, nur etwas komplizierter.

    – jedrzej.kurylo

    30. Juli ’15 um 17:20


  • @jedrzej.kurylo Darf ich wissen, wie man CSRF-Token in Laravel 5.0 deaktiviert.

    – Katastrophe

    3. Juni ’19 um 5:37

csrf in Laravel fur eine bestimmte Route deaktivieren
jedrzej.kurylo

Seit Version 5.1 Laravels VerifyCsrfToken Middleware ermöglicht die Angabe von Routen, die von der CSRF-Validierung ausgeschlossen sind. Um dies zu erreichen, müssen Sie die Routen zu hinzufügen $außer Array in deinem AppHttpMiddlewareVerifyCsrfToken.php Klasse:

<?php namespace AppHttpMiddleware;

use IlluminateFoundationHttpMiddlewareVerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier
{
  protected $except = [
    'payment/*',
  ];
}

Siehe die Dokumente für mehr Informationen.

  • Hallo Jedrzej, die obige Methode habe ich verwendet, aber sie funktioniert nicht mit Laravel 5.2. Ich muss wissen, wie CSRF-Token für API-Routen für die obige ähnliche Lösung für die Laravel 5.2-Version deaktiviert werden kann.

    – Sankar Muniyappa

    8. August ’16 um 13:14

  • Das Ausschließen von URIs in 5.2 funktioniert auf die gleiche Weise – siehe die Dokumentation hier laravel.com/docs/5.2/routing#csrf-exklusive-uris

    – jedrzej.kurylo

    8. August ’16 um 14:55

csrf in Laravel fur eine bestimmte Route deaktivieren
GetoX

Seit Laravel 7.7 können Sie Methode verwenden withoutMiddleware z.B:

Route::get('/payment/ok',   'TransactionsController@Ok')
    ->withoutMiddleware([AppHttpMiddlewareVerifyCsrfToken::class]);

Route::get('/payment/fail', 'TransactionsController@Fail')
    ->withoutMiddleware([AppHttpMiddlewareVerifyCsrfToken::class]);

  • Sie sollten das csrf-Feld zum app/Http/Kernel.php $routeMiddleware-Array wie dieses ‘csrf’ hinzufügen => VerifyCsrfToken::class

    – Ozal Zarbaliyev

    27. Januar ’21 um 8:24

  • Wie @ozal-zarbaliyev erwähnte, gibt es keine Middleware mit Namen csrf . Benutz einfach AppHttpMiddlewareVerifyCsrfToken::class in withoutMiddleware Funktion.

    – Sadegh PM

    31. Januar ’21 um 9:21


Die von @jedrzej.kurylo beschriebene Technik funktioniert gut, um eine oder zwei Seiten auszuschließen.

Hier ist eine andere Technik, wenn Sie viele Seiten von der CSRF-Validierung ausschließen müssen, mit mehr Zukunftssicherheit.

Sie können Ihre Routen segmentieren und auf jede unterschiedliche Middleware anwenden. So können Sie Ihre Zahlungsrouten in separate Routengruppen einteilen und VerifyCsrfToken nicht darauf anwenden. Hier ist wie.

1. Erstellen Sie eine Routendatei

Du wirst es in deinem . bemerken routes Verzeichnis haben Sie folgenden Baum:

  • routes/
  • routes/api.php
  • routes/web.php

Erstellen Sie hier eine neue Datei, routes/payment.php, und fügen Sie oben Ihre Routen hinzu:

<?php
use IlluminateSupportFacadesRoute;

Route::get('/payment/ok',   'TransactionsController@Ok');
Route::get('/payment/fail', 'TransactionsController@Fail');

2. Bearbeiten Sie die Route mit dem RouteServiceProvider

In Laravel werden Routen bearbeitet von appProvidersRouteServiceProvider.php. Sie werden diese Funktionen bemerken: map() und mapWebRoutes(). Fügen Sie dieser Datei entsprechend hinzu (ich habe die Aktienkommentare der Kürze halber ausgeschlossen).

    public function map()
    {
        $this->mapApiRoutes();
        $this->mapWebRoutes();
        $this->mapPaymentRoutes(); // <---- add this line
    }

    protected function mapWebRoutes()
    {
        Route::middleware('web')
             ->namespace($this->namespace)
             ->group(base_path('routes/web.php'));
    }

    protected function mapPaymentRoutes()  // <--- Add this method
    {
        Route::middleware('payment')       // <--- this line is important
             ->namespace($this->namespace)
             ->group(base_path('routes/payment.php'));
    }

Beachten Sie, dass wir eine neue Middleware-Schicht hinzugefügt haben. Dies ist wichtig für den nächsten Schritt.

3. Fügen Sie eine neue Middleware-Schicht hinzu

Ihre Middleware für Ihre Routengruppen ist definiert in AppHttpKernel.php.

Aktualisieren Sie die $middlewareGroups Property, und fügen Sie einen mittleren Eintrag für ‘payment’ hinzu. Es kann genauso sein wie web, aber ohne das VerifyCsrfToken Linie.

    protected $middlewareGroups = [
        'web' => [
            AppHttpMiddlewareEncryptCookies::class,
            IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
            IlluminateSessionMiddlewareStartSession::class,
            IlluminateSessionMiddlewareAuthenticateSession::class,
            IlluminateViewMiddlewareShareErrorsFromSession::class,
            AppHttpMiddlewareVerifyCsrfToken::class,
            IlluminateRoutingMiddlewareSubstituteBindings::class,
            AppHttpMiddlewareNoClickjack::class,
            AppHttpMiddlewareSecureReferrerPolicy::class,
            AppHttpMiddlewareNoXssScripting::class,
        ],

        // ********** Add this *******************
        'payment' => [
            AppHttpMiddlewareEncryptCookies::class,
            IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
            IlluminateSessionMiddlewareStartSession::class,
            IlluminateSessionMiddlewareAuthenticateSession::class,
            IlluminateViewMiddlewareShareErrorsFromSession::class,

// This is the line you want to comment-out / remove
//            AppHttpMiddlewareVerifyCsrfToken::class,     

            IlluminateRoutingMiddlewareSubstituteBindings::class,
            AppHttpMiddlewareNoClickjack::class,
            AppHttpMiddlewareSecureReferrerPolicy::class,
            AppHttpMiddlewareNoXssScripting::class,
        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];

🎉.

Wenn Sie jetzt neue Routen hinzufügen, die von der CSRF-Token-Prüfung ausgeschlossen werden müssen, fügen Sie sie dem routes/payment.php Datei.

  • Ich würde das als Over-Engineering bezeichnen

    – Orkhan Alikhanov

    29. September ’20 um 16:16

.

295040cookie-checkcsrf in Laravel für eine bestimmte Route deaktivieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy