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 令牌检查。
我目前正在编写测试以确保我们的 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 令牌检查。