【发布时间】: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