Laravel PHPUnit总是通过CSRF

问题描述:

我目前正在编写一个测试来确保我们的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

看看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()