2016-06-09 76 views
0

我目前正在編寫一個測試來確保我們的CSRF保護在Laravel工作。測試看起來像這樣。Laravel PHPUnit總是通過CSRF

public function testSecurityIncorrectCSRF() 
{ 
    $this->visit('/login') 
    ->type('REDACTED', 'email') 
    ->type('123123', 'password'); 

    session()->regenerateToken(); 

    $this->press('login') 
    ->seePageIs('/login'); 
} 

無論我做什麼,即使我傳遞錯誤的_token,登錄請求也會始終成功。我已經在PHPUnit測試之外嘗試過,並且那裏的CSRF保護工作。我的所有中間件都已啓用,因此應啓用CSRF保護。

有人可以解釋爲什麼會發生這種情況嗎?

+0

是否修改默認的'應用程序\ HTTP \ kernel.php'文件和移動網絡'中間件在其他地方? – Ohgodwhy

+0

'$保護= middlewareGroups [ '網絡'=> [ \照亮\會議\中間件\ StartSession ::類, \軟件\ HTTP \中間件\ VerifyCsrfToken ::類, ]' – Hedam

+0

它基本上是原來的內核,只是一些額外的中間件 – Hedam

回答

3

看看Illuminate\Foundation\Http\Middleware\VerifyCsrfToken這個類,特別是handle的方法。

public function handle($request, Closure $next) 
{ 
    if (
     $this->isReading($request) || 
     $this->runningUnitTests() || 
     $this->shouldPassThrough($request) || 
     $this->tokensMatch($request) 
    ) { 
     return $this->addCookieToResponse($request, $next($request)); 
    } 

    throw new TokenMismatchException; 
} 

它總是通過了CSRF令牌檢查,如果檢測到請求來自一個單元測試:$this->runningUnitTests()