Laravel PHPUnit 始终通过 CSRF

Laravel PHPUnit always passes CSRF

我目前正在编写测试以确保我们的 CSRF 保护在 Laravel 中有效。测试看起来像这样。

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

     session()->regenerateToken();

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

无论我做什么,即使我传递了一个错误的_token,登录请求总是会成功。我在 PHPUnit 测试之外尝试过,CSRF 保护起作用了。我所有的中间件都启用了,所以应该启用CSRF保护。

谁能解释为什么会这样?

看看 Illuminate\Foundation\Http\Middleware\VerifyCsrfToken class,尤其是 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()

一个解决方案是将以下代码放在测试函数的开头:

$this->app['env'] = 'production';

这会将环境更改为生产环境,从而启用 csrf 令牌检查。