"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
如您所见,第二个选项无法反序列化。
老实说,我不知道如何解决这个问题。
以下是我尝试或看到的一些内容:
- 清除会话和缓存 - 无效
- key:generate - 无法执行此操作,因为它正在生产中
- 将 EncryptCookies 中的 $serialize 变量设置为 false - 我在 Laravel 5.5
中工作
编辑
我忘了说,这个版本从未升级过。它已在 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 序列化是更简单和安全的方法。
正如标题所说,我在 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 时遇到的问题,这可能发生在一周前(可能在您不知情的情况下,检查 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 序列化是更简单和安全的方法。