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保护。
有人可以解释为什么会发生这种情况吗?
答
看看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()
是否修改默认的'应用程序\ HTTP \ kernel.php'文件和移动网络'中间件在其他地方? – Ohgodwhy
'$保护= middlewareGroups [ '网络'=> [ \照亮\会议\中间件\ StartSession ::类, \软件\ HTTP \中间件\ VerifyCsrfToken ::类, ]' – Hedam
它基本上是原来的内核,只是一些额外的中间件 – Hedam