2016-06-09 8 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

Have вы изменили по умолчанию 'App \ Http \ kernel.php' файл и переместили' Интернета «промежуточное ПО где-то в другом месте? – Ohgodwhy

+0

'защищен $ middlewareGroups = [ 'паутина' => [ \ Осветите \ Session \ Middleware \ StartSession :: класс, \ App \ Http \ Middleware \ VerifyCsrfToken :: класс, ]]' – Hedam

+0

Это в основном оригинальные ядра , только с некоторыми дополнительными Middlewares – 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()

Смежные вопросы