ajax csrf php,laravel5.3中ajax post请求需要自己将VerifyCsrfToken加入到Kernel.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'

中?

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

结帖。是需要

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值