laravel5.3中ajax post请求需要自己将VerifyCsrfToken加入到Kernel.php中吗?
天蓬老师
天蓬老师 2017-04-11 10:21:51
[PHP讨论组]

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

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'中?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(2)
迷茫

哎,既然你要防csrf,就要加上去。laravel默认情况下创建的api中间件组是没有防csrf的。

黄舟

结帖。是需要

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号