2015-12-23 69 views
2

中間件:Laravel CSRF中間件不檢查X-CSRF-TOKEN請求頭

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

class VerifyCsrfToken extends BaseVerifier { 

    public function handle($request, Closure $next) 
    { 
     return parent::handle($request, $next); 
    } 

} 

使用Javascript:

$.ajaxSetup({ 
    headers: { 
     'X-CSRF-TOKEN': 'wrong-token-to-test', 
     'X-XSRF-TOKEN': 'another-wrong-token-to-test', 
    } 
}); 

刀片:

$.ajax({ 
     method: "POST", 
     url: "{{url("login/$user")}}", 
     data: { 
     "email": $("#email").val(), 
     "password": CryptoJS.SHA256($('#password').val()).toString(), 
     "_token": "{{csrf_token()}}" 
     } 
}) 

即使使用了錯誤的HTTP標頭值('錯誤標記對測試')csrf標記不會導致任何標記不匹配異常。請求正常處理。這是否意味着Laravel沒有檢查X-CSRF-TOKEN標題?

回答

4

Laravel 第一嘗試從堪稱getpost_token參數的CSRF令牌,如果丟失,THEN它試圖從X-CSRF-TOKEN得到它。下面是在代碼中執行邏輯/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken,方法tokensMatch

$token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN'); 

但你已經有效地包括_token參數(與正確的值)在你的Ajax後:

"_token": "{{csrf_token()}}" 

所以不要緊,你在X-CSRF-TOKEN標題中發送的內容。

+0

令人驚歎!非常感謝!!! –

+0

謝謝@Amarnasan可愛的編輯! –