最新的 Cookies Laravel 上的“反序列化:61 个字节的偏移量 0 处出错”

问题描述

正如标题所说,我在 Laravel 5.5 中遇到了一个错误

unserialize(): Error at offset 0 of 61 bytes

然而,这在以前从未发生过。它在一周前开始发生。

用户(来宾)点击按钮时,ajax 请求会发送到服务器,为用户创建 cookie,将其保存到数据库并将其保存到用户浏览器

如果用户未通过身份验证且其 cookie 尚未创建,则执行此代码

$hash = randHash(20);

// Cookie is saved into DB

Cookie::queue('Posts',$hash,45000);

然后在服务器上有一个中间件,它会在每个请求上执行。

if($cookie = Cookie::get('Posts')){
   $cookie = Crypt::decrypt($cookie);

   // Rest of code
}

问题是一周前,最新的 cookie 变得无法反序列化。在我仔细检查后,我发现了这一点:

我在没有反序列化的情况下解密了 cookie,而不是看起来像这样:

s:20:"Cookie";

看起来像这样:

SomeRandomString|Cookie

如您所见,第二个选项无法反序列化。 老实说,我不知道如何解决这个问题。

以下是我尝试或看到的一些内容

  • 清除会话和缓存 - 无效
  • key:generate - 无法执行此操作,因为它正在生产中
  • 将 EncryptCookies 中的 $serialize 变量设置为 false - 我在 Laravel 5.5 中工作

编辑

我忘了说,这个版本从来没有升级过。它已部署在 5.5 上并从那时起一直保持这种状态。

解决方法

这是我在从 laravel 5.4 升级到 5.5 时遇到的一个问题,这可能发生在一周前(可能在您不知情的情况下,检查 composer.json 上的 git log)。有人试图使用在您的应用程序为 5.4 时登录的 cookie 登录该站点,但现在他们无法使用 5.5,因为我认为这是向后兼容性缺失。

为了让用户在 5.5 版本的网站上重回正轨,他们可以使 cookie 过期,然后他们将能够重新登录。

请关注从 5.5 升级到 5.5.42(安全版本)中的部分: https://laravel.com/docs/5.5/upgrade

升级到 5.5.42 会从您的应用程序中删除 cookie 序列化,因此不再调用 unserialize(),并且您不会收到上述错误。

我相信您正在开发 Laravel 5.5,但不是最后一个版本 5.5.42。当我在 Composer 中更新到 5.5 时,它错过了这个版本,因为我应用了到 5.5 的升级并且没有更高的版本来最小化依赖项更改。

您可以通过注销、清除 cookie、检查 5.4 版本、composer 安装、登录、安装 5.5 版本,然后点击本地来重复错误。

可以在中间件处捕获异常并在那里处理,但摆脱 cookie 序列化是更简单、更安全的方法。