Laravel EncryptCookies :: decrypt()在Chrome

时间:2018-04-07 03:47:47

标签: laravel google-chrome encryption cookies session-cookies

似乎Cookie解密在Google Chrome中随机失败。

protected function decrypt(Request $request)
{
    foreach ($request->cookies as $key => $c) {
        if ($this->isDisabled($key)) {
            continue;
        }

        try {
            $request->cookies->set($key, $this->decryptCookie($c));
        } catch (DecryptException $e) {
            dd('exception: ', $e);  // added by me to see the failure
            $request->cookies->set($key, null);
        }
    }

    return $request;
}

以下是失败时的输出:

"exception: "
DecryptException {#318 ▼
  #message: "The payload is invalid."
  #code: 0
  #file: 
"C:\...\vendor\laravel\framework\src\Illuminate\Encryption\Encrypter.php"
  #line: 191

有时会有一些关于X-XSRF-TOKEN在解密时失败的帖子:

Laravel DecryptException - The payload is invalid https://www.reddit.com/r/laravel/comments/4xl01y/xxsrftoken_fails_frequently_on_decryption_and/

奇怪的是,每当我刷新页面时,有时会抛出DecryptException,但大多数情况下try语句都会成功。当我在IE和Firefox中测试时,try语句总是成功。

我从Chrome中删除了Cookie等,但这并没有解决问题。

我很感激任何想法,因为我花了很多时间来处理这个问题。

更新1 :当我删除'remember_web _...'cookie时,我不再获得异常。不过,我不知道为什么记住cookie会在Chrome中引起解密异常。

更新2 :更多拼图。当decrypt()抛出异常时,它正在解密的cookie只是请求cookie的一部分,它解释了异常。例如,客户端请求标头中的cookie是

eyJpdiI6IjRaZ3dpVlNMRjB0TEJiNCtRVlUrN2c9PSIsInZhbHVlIjoicHJNYUdOMDc3azdJXC9
sV0lYTThZTDB6aERXV1JwTFhTb2xVbEdEaXhVekJmTkFoVGVQalFEK2ZqamNPWUFHcVREZE9cL3
pjQjRGdHBcL25scENJN0UxRGc9PSIsIm1hYyI6IjI5MzdhNzJiNmNhOTMyNmE2NjhmNzI4ZGRlM
2ZlZWVjM2Q3NGFiYmEzMGZhZmIxZWZlYWNmYzNlZjAzOWU0OWIifQ%3D%3D

但正在解密的cookie缺少客户端请求cookie的最后89个字符:

eyJpdiI6IjRaZ3dpVlNMRjB0TEJiNCtRVlUrN2c9PSIsInZhbHVlIjoicHJNYUdOMDc3azdJXC9
sV0lYTThZTDB6aERXV1JwTFhTb2xVbEdEaXhVekJmTkFoVGVQalFEK2ZqamNPWUFHcVREZE9cL3
pjQjRGdHBcL25scENJN0UxRGc9PSIsIm1hYyI6IjI5Mzd

以下是说明问题的屏幕截图: cookie mismatch

我认为现在的问题是,为什么服务器端Request头中的cookie会从客户端请求标头中丢失部分Cookie?

更新3 :Cookie中缺少的字符数似乎取决于Cookie名称长度。当我使用一个非常长的cookie名称时,缺少的字符数量会增加,反之亦然。这也解释了为什么删除记住cookie或XSRF cookie可以解决问题。同样,这有时只会失败所以我不确定为什么它不是恒定的。

0 个答案:

没有答案