V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xx19941215
V2EX  ›  PHP

laravel5.3 中 ajax post 请求需要自己将 VerifyCsrfToken 加入到 Kernel. PHP 中吗?

  •  
  •   xx19941215 · 2017-03-21 15:47:56 +08:00 · 1790 次点击
    这是一个创建于 2565 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在写一个 ajax post 控制器的时候想到了需要做 csrf 防御。看网上说 ajax 发请求的时候可以加_token 字段或者设置请求头来解决身份问题。我在 Illuminate\Foundation\Http\Middleware\VerifyCsrfToken 中也看到了相关的代码:

    protected function tokensMatch($request)
        {
            $sessionToken = $request->session()->token();
            //使用_token 字段或者请求头中的 X-CSRF-TOKEN 做$token
            $token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');
    
            if (! $token && $header = $request->header('X-XSRF-TOKEN')) {
                //没有的话使用 cookie 中加密的 X-XSRF-TOKEN 解密之后作为$token
                $token = $this->encrypter->decrypt($header);
            }
    
            if (! is_string($sessionToken) || ! is_string($token)) {
                return false;
            }
            //判断是否相等
            return hash_equals($sessionToken, $token);
        }
    

    好了,下面说我的疑问,

    Route::group([
        'prefix' => 'api'
    ], function(){
            Route::post('/collection/collect', 'Collection\Rest\CollectionCollectController@post')
            ->name('collectionCollect');});
    

    以上是路由,以下是控制器

    <?php
    namespace App\Http\Controllers\Mass\Collection\Rest;
    
    use App\Http\Controllers\Controller;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\DB;
    
    class CollectionCollectController extends Controller
    {
        public function post(Request $request)
        {
            DB::table('collection_product')->insert([
                'c_eid' => $request->get('c_eid'),
                'p_eid' => $request->get('p_eid')
            ]);
    
            return [
                'status' => 'ok'
            ];
        }
    }
    

    我在使用使用 js 异步访问该路由的时候在上面说到的tokensMatch方法中试图打印出$token 但是发现程序并没有走这个中间件。

    protected function tokensMatch($request)
        {
            $sessionToken = $request->session()->token();
            //使用_token 字段或者请求头中的 X-CSRF-TOKEN 做$token
            $token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');
    
            if (! $token && $header = $request->header('X-XSRF-TOKEN')) {
                //没有的话使用 cookie 中加密的 X-XSRF-TOKEN 解密之后作为$token
                $token = $this->encrypter->decrypt($header);
            }
    
            if (! is_string($sessionToken) || ! is_string($token)) {
                return false;
            }
            //打印$token,但是发现这里没有执行
            dd($token);
            return hash_equals($sessionToken, $token);
        }
    

    这样看来,是需要自己将 VerifyCsrfToken 中间件加到 Kernel.php 中的$middlewareGroups中吗?

    protected $middlewareGroups = [
            'web' => [
                \App\Http\Middleware\EncryptCookies::class,
                \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
                \Illuminate\Session\Middleware\StartSession::class,
                \Illuminate\View\Middleware\ShareErrorsFromSession::class,
                \App\Http\Middleware\VerifyCsrfToken::class,
                \Illuminate\Routing\Middleware\SubstituteBindings::class,
            ],
    
            'api' => [
                'throttle:60,1',
                'bindings',
            ],
        ];
    
    

    加入到'api'中?

    4 条回复    2017-03-21 17:38:00 +08:00
    jellybool
        1
    jellybool  
       2017-03-21 16:31:43 +08:00 via iPhone
    看你路由注册在 web.php 还是 api.php
    zaishanfeng
        2
    zaishanfeng  
       2017-03-21 16:34:42 +08:00 via Android
    取消就行。 往这各类上面看 有个变量是控制哪些路由可以取消
    xx19941215
        3
    xx19941215  
    OP
       2017-03-21 16:49:39 +08:00
    @jellybool 注册在 api 里面
    xx19941215
        4
    xx19941215  
    OP
       2017-03-21 17:38:00 +08:00
    结帖,是需要的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2764 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 12:18 · PVG 20:18 · LAX 05:18 · JFK 08:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.