在laravel中禁用特定路由的csrf

31 php laravel laravel-5 laravel-5.1

我有一个支付系统,数据提交给第三方网站,而不是拖回...

当数据返回时它命中特定的url让我们说/ ok route.$_REQUEST['transaction'].

但由于laravel中间件,我得到令牌不匹配.第三方支付API无法生成令牌,所以我如何禁用它?只为这条路线?

还是有更好的选择?

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;

    }

}
Run Code Online (Sandbox Code Playgroud)

jed*_*ylo 86

从版本5.1开始, Laravel的VerifyCsrfToken中间件允许指定从CSRF验证中排除的路由.为了实现这一点,您需要在App\Http\Middleware\VerifyCsrfToken.php类中将路由添加到$ except数组:

<?php namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier
{
  protected $except = [
    'payment/*',
  ];
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅文档.


Get*_*toX 11

从 Laravel 7.7 开始,您可以使用方法,withoutMiddleware例如:

Route::get('/payment/ok',   'TransactionsController@Ok')
    ->withoutMiddleware([\App\Http\Middleware\VerifyCsrfToken::class]);

Route::get('/payment/fail', 'TransactionsController@Fail')
    ->withoutMiddleware([\App\Http\Middleware\VerifyCsrfToken::class]);
Run Code Online (Sandbox Code Playgroud)


haz*_*haz 6

@jedrzej.kurylo 描述的技术非常适合排除一两个页面。

如果您需要从 CSRF 验证中排除大量页面,那么这里有一种不同的技术,并且具有更多的面向未来的能力。

您可以对路由进行分段,并对每个路由应用不同的中间件。因此,您可以将您的支付路由放入单独的路由组中,而不对其应用VerifyCsrfToken。就是这样。

1.创建路由文件

您会注意到在您的routes目录中有以下树:

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

在这里创建一个新文件,routes/payment.php并将上面的路由添加到其中:

<?php
use Illuminate\Support\Facades\Route;

Route::get('/payment/ok',   'TransactionsController@Ok');
Route::get('/payment/fail', 'TransactionsController@Fail');
Run Code Online (Sandbox Code Playgroud)

2.使用RouteServiceProvider处理路由

在 Laravel 中,路由由app\Providers\RouteServiceProvider.php. 您会注意到这些函数:map()mapWebRoutes()。相应地添加到此文件(为简洁起见,我排除了股票评论)。

    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'));
    }

Run Code Online (Sandbox Code Playgroud)

请注意,我们添加了一个新的中间件层。这对于下一步很重要。

3.添加新的中间件层

路由组的中间件在 中定义App\Http\Kernel.php

更新$middlewareGroups属性,并添加“付款”的中间条目。它可以与 完全相同web,但没有VerifyCsrfToken行。

    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
            \App\Http\Middleware\NoClickjack::class,
            \App\Http\Middleware\SecureReferrerPolicy::class,
            \App\Http\Middleware\NoXssScripting::class,
        ],

        // ********** Add this *******************
        'payment' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,

// This is the line you want to comment-out / remove
//            \App\Http\Middleware\VerifyCsrfToken::class,     

            \Illuminate\Routing\Middleware\SubstituteBindings::class,
            \App\Http\Middleware\NoClickjack::class,
            \App\Http\Middleware\SecureReferrerPolicy::class,
            \App\Http\Middleware\NoXssScripting::class,
        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];
Run Code Online (Sandbox Code Playgroud)

现在,每当您添加需要从 CSRF 令牌检查中排除的新路由时,请将它们添加到文件中routes/payment.php

  • 我称之为过度设计 (7认同)