unserialize():40个字节的偏移量0处出错错误

时间:2018-08-13 08:14:01

标签: laravel

我想使用php artisan serve在本地主机上运行我的应用程序,但出现此错误unserialize(): Error at offset 0 of 40 bytes,这是我的问题所在?

12 个答案:

答案 0 :(得分:45)

您必须设置新闻密钥生成,因为

php artisan key:generate

在测试之后再次运行Laravel应用程序

php artisan serve

答案 1 :(得分:40)

当我将Laravel 5.5应用程序升级到5.6时,我遇到了同样的错误。错误来自straight_list = [[260,263,260],[339,337,343]] -中间件。

在浏览器中删除cookie和/或在Laravel应用中清除会话文件。

答案 2 :(得分:3)

几天前,我从Envoyer将生产更新推送到Laravel项目时,也遇到了同样的错误。

立即修复:  我尝试回滚到先前的提交,但是问题仍然存在,这意味着问题源自客户端,可能是Cookie。我尝试删除Cookie,但问题消失了。

后来,我花了很多时间寻找此问题,但直到今天再进行一次部署再次遇到此问题,我什么都没得到,我在Laravel news about the security fix 5.6.30更新中找到了这篇文章。如果我尝试为已经使用> v5.6.30的项目部署laravel v5.6.26的先前版本(<5.6.30),并且已经创建(未序列化)cookie,则可以确定出现此问题。 <5.6.30版本的框架尝试错误地反序列化结果,因为未正确识别结果。

  • 安装laravel / framework(v5.6.26) 从缓存加载

From the upgrade guide:

  

配置Cookie序列化,因为此漏洞无法   无需访问应用程序的加密密钥即可被利用,   我们选择提供一种重新启用加密cookie的方法   使您的应用程序与这些兼容时进行序列化   变化。要启用/禁用Cookie序列化,您可以更改   App \ Http \ Middleware \ EncryptCookies的静态序列化属性   中间件:

我能够通过清除composer的缓存来永久解决此问题,从而强制其加载框架的最新版本,而不是退回到缓存。

希望这会有所帮助。

最佳,

答案 3 :(得分:3)

在我的情况下,我确实删除了composer.lock,并做了composer install,瞧瞧...

$ cd project_root
$ rm composer.lock
$ composer install

答案 4 :(得分:3)

我遇到了同样的问题。我在无家可归的环境中经常遇到这个问题。 要在Laravel 5.4、5.5、5.6或更高版本中解决此问题-

php artisan config:clear

php artisan view:clear

php artisan key:generate

答案 5 :(得分:2)

只需检查浏览器中的元素,然后转到应用程序选项卡并选择cookie,然后删除所有cookie。就是这样。

Apples Documentation

答案 6 :(得分:1)

在App \ Exceptions \ Handler中,呈现功能使用此代码段,它将重置浏览器cookie。

if (str_contains($exception->getMessage(), 'unserialize')) {
    $cookie1 = \Cookie::forget('laravel_session');
    $cookie2 = \Cookie::forget('XSRF-TOKEN');

    return redirect()->to('/')
                 ->withCookie($cookie1)
                 ->withCookie($cookie2);
}

答案 7 :(得分:1)

当我偶然更新作曲家时,我也遇到了这个问题。 如果您输入

protected static $serialize = true;

在App \ Http \ Middleware \ EncryptCookies中,旧的cookie将破坏您的系统。因此,为防止这种情况,您必须清除cookie,或者只是不对解密的cookie进行反序列化。

我为此采取了一种解决方法: 内部供应商/laravel/framework/src/Illuminate/Encryption/Encrypter.php 在以下这行crypto()函数上方:

return $unserialize ? unserialize($decrypted) : $decrypted;

添加:

try {
            return $unserialize ? unserialize($decrypted) : $decrypted;
        } catch (\Exception $e){
            return $decrypted;
        }

这可能很丑陋,但是您可以暂时将其放在那里,直到您认为旧的Cookie消失了。

答案 8 :(得分:0)

就我而言,我试图用错误的函数解密哈希。

我正在使用 encryptString() 创建加密

$hash = Crypt::encryptString('secret');

但我尝试使用decrypt()解密

$value = Crypt::decrypt($hash);

正确的做法是

$value = Crypt::decryptString($hash);

因此,当您使用 Crypt::encrypt() 进行加密时,您必须使用 Crypt::decrypt() 对其进行解密,对于 Crypt::encryptString() 使用 Crypt::decryptString()

答案 9 :(得分:0)

就我而言,发生在本地开发期间。 导致问题的步骤是:

  1. 我在单独的分支上将 latavel 升级到 5.8
  2. 我切换到另一个拥有 laravel 5.2 的分支(在我的情况下,我必须查看 PR)

我也登录了我的应用程序,因此也有一个会话 cookie。在那种情况下,我只是清除了浏览器的 cookie 并获取了新的 cookie。

在 firefox 中可以通过访问完成,然后选择 about:preferences#privacy 并选择适当的选项。如下图所示(希腊语)

Privacy setting and an indication where the user to click Setting to clean its cookies as well

另一种诊断问题的方法是打开私人 Firefox 窗口或使用 chromes 认知模式。

答案 10 :(得分:-1)

是的,对于本地主机,您只能删除cookie,但是对于生产而言,请将其放入错误处理程序中,以便用户看不到声音:

if (strpos($exception->getMessage(), 'unserialize(): Error at offset 0 of 40 bytes') === 0) {
    unset($_COOKIE['laravel_session']);
    unset($_COOKIE['XSRF-TOKEN']);

    setcookie('laravel_session', null, -1, '/');
    setcookie('XSRF-TOKEN', null, -1, '/');

    abort(200, '', ['Location' => route('frontend.home')]);
}

PS。经过laravel 5.6测试。

答案 11 :(得分:-2)

您将只在终端中运行

composer global update