laravel-CSRF

[PHP] - Laravel - CSRF token禁用方法
方法一

打開文件:app\Http\Kernel.php

把這行注釋掉:'App\Http\Middleware\VerifyCsrfToken'

方法二

打開文件:app\Http\Middleware\VerifyCsrfToken.php

修改為:
<?php namespace App\Http\Middleware;

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

class VerifyCsrfToken extends BaseVerifier {

/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    // 使用CSRF
    //return parent::handle($request, $next);
    // 禁用CSRF
    return $next($request);
}

}

CSRF的使用有兩種,一種是在HTML的代碼中加入:

<input type="hidden" name="_token" value="{{ csrf_token() }}" />

另一種是使用cookie方式。

使用cookie方式,需要把app\Http\Middleware\VerifyCsrfToken.php修改為:

<?php namespace App\Http\Middleware;

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

class VerifyCsrfToken extends BaseVerifier {

/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    return parent::addCookieToResponse($request, $next($request));
}

}

使用cookie方式的CSRF,可以不用在每個頁面都加入這個input的hidden標簽。

當然,也可以對指定的表單提交方式使用CSRF,如:

<?php namespace App\Http\Middleware;

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

class VerifyCsrfToken extends BaseVerifier {

/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    // Add this:
    if($request->method() == 'POST')
    {
        return $next($request);
    }
    
    if ($request->method() == 'GET' || $this->tokensMatch($request))
    {
        return $next($request);
    }
    throw new TokenMismatchException;
}

}
只對GET的方式提交使用CSRF,對POST方式提交表單禁用CSRF

擴展:::
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">{{ csrf_token() }}

該段代碼等同于全局幫助函數csrf_field的輸出:

<?php echo csrf_field(); ?>
在Blade模板引擎中還可以使用如下方式調用:
{!! csrf_field() !!} 顯示html標簽

3、X-CSRF-Token及其使用
如果使用Ajax提交POST表單,又該如何處理呢?我們可以將Token設置在meta中:

<meta name="csrf-token" content="{{ csrf_token() }}">

然后在全局Ajax中使用這種方式設置X-CSRF-Token請求頭并提交:

$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
Laravel的VerifyCsrfToken中間件會檢查X-CSRF-TOKEN請求頭,如果該值和Session中CSRF值相等則驗證通過,否則不通過。

4.獲取相關token值
<input type="hidden" name="_token" value="{{ csrf_token() }}" />
$("input[name='_token']").val();
<input type="hidden" id="_token" value="{{ csrf_token() }}" />
$("#_token").val();
<meta name="_token" content="{{csrf_token()}}"/>
$("meta[name='_token']").attr('content');

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 先說幾句廢話,調和氣氛。事情的起由來自客戶需求頻繁變更,偉大的師傅決定橫刀立馬的改革使用新的框架(created ...
    wsdadan閱讀 3,097評論 0 12
  • CSRF攻擊與防御-start 什么是CSRF攻擊?CSRF是跨站請求偽造(Cross-site request ...
    碼課sir閱讀 719評論 0 0
  • Laravel框架一:原理機制篇 Laravel作為在國內國外都頗為流行的PHP框架,風格優雅,其擁有自己的一些特...
    Mr_Z_Heng閱讀 3,741評論 0 13
  • laravel在設計之初就加入了CSRF的 跨站攻擊的防范,當然我們在設計API的時候其實CSRF是有點多余的那么...
    乖乖的魚兒記閱讀 575評論 0 0
  • 0.1配置1.模板繼承2.控制器3.git4.支付寶支付的流程5.路由6.中間件7.請求8.laravel 學習筆...
    云龍789閱讀 841評論 0 5