"unserialize(): Error at offset 0 of 61 bytes" 在最新的 Cookie 上 Laravel

"unserialize(): Error at offset 0 of 61 bytes" on latest Cookies Laravel

正如标题所说,我在 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

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

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


编辑

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

这是我在从 laravel 5.4 升级到 5.5 时遇到的问题,这可能发生在一周前(可能在您不知情的情况下,检查 git 登录 composer.json).有人试图使用您的应用程序是 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 序列化是更简单和安全的方法。