【问题标题】:"unserialize(): Error at offset 0 of 61 bytes" on latest Cookies Laravel最新的 Cookie Laravel 上的“反序列化():61 字节偏移量 0 处出错”
【发布时间】:2021-05-13 02:43:41
【问题描述】:

正如标题所说,我在生产中的 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 上部署并一直保持这种状态。

【问题讨论】:

  • 嗯,问题是“Cookie”不是 20 个字符长。不知道为什么,这里可能涉及到一个多字节字符集
  • 我检查过了,不,cookie 有 20 个字符长。在 DB 中,即使它们被解密为第二种形式: SomeRandomString|Cookie Cookie 部分应该是 20 个字符

标签: php laravel-5 cookies deserialization


【解决方案1】:

这是我从 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 序列化是更简单和安全的方法。

【讨论】:

  • 是的,对不起,我应该提一下,服务器 Laravel 版本从未升级。它已在 5.5 上部署并从那时起一直保持这种状态。
  • 好的,没问题,不过如果有可能,升级到 5.5.42 应该可以解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
相关资源
最近更新 更多