我目前正在编写测试,以确保我们的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保护。
有人可以解释为什么会这样吗?
答案 0 :(得分:4)
查看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()