为什么当我使用 memcached 作为 Laravel 会话驱动程序时,csrf 验证总是失败?

问题描述 投票:0回答:1

我注意到,当我将

SESSION_DRIVER
设置为其他驱动程序(例如 redis)时,一切正常,但是当设置为
memcached
时,我的请求总是会因为 CSRF 令牌不匹配而失败。

我去看了Laravel的

Illuminate\Foundation\Http\Middleware\ValidateCsrfToken
中间件,或者更准确地说,
Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
;我注意到所有布尔值在其条件下都是假的

   public function handle($request, Closure $next)
    {
        if (
            $this->isReading($request) ||
            $this->runningUnitTests() ||
            $this->inExceptArray($request) ||
            $this->tokensMatch($request)
        ) {
            return tap($next($request), function ($response) use ($request) {
                if ($this->shouldAddXsrfTokenCookie()) {
                    $this->addCookieToResponse($request, $response);
                }
            });
        }

        throw new TokenMismatchException('CSRF token mismatch.');
    }

我更深入地研究了

tokensMatch()
方法。

    protected function tokensMatch($request)
    {
        $token = $this->getTokenFromRequest($request);

        return is_string($request->session()->token()) &&
               is_string($token) &&
               hash_equals($request->session()->token(), $token);
    }

我了解到,当我使用

memcached
作为驱动程序时,
$request->session()->token()
$this->getTokenFromRequest($request)
不匹配。但为什么呢?

php-memcached是我的memcached php扩展

php laravel memcached
1个回答
0
投票

问题解决了。我已经使用 docker 镜像安装了 memcached。安装后,您需要执行如下所示的memcached二进制文件(是否为守护进程):

memcached -v -u www-data

我至少预计会出现一个错误。不知道为什么 Laravel 在没有 memcached 启动的情况下工作得很好!

© www.soinside.com 2019 - 2024. All rights reserved.