【问题标题】:unserialize(): Error at offset 0 of 40 bytes Errorunserialize():偏移量 0 处的错误,共 40 个字节错误
【发布时间】:2018-08-13 08:14:00
【问题描述】:

我想使用 php artisan serve 在 localhost 中运行我的应用程序,但我收到此错误 unserialize(): Error at offset 0 of 40 bytes 我的问题在哪里?

【问题讨论】:

  • 您是否开箱即用?或者错误出现在哪个代码部分?如果没有一些代码或更多信息,帮助您有点困难。
  • 我该如何解释我的问题?我只是在应用程序@Stony 的所有页面中都收到此错误
  • 试试php artisan serve -vvv。公平地说,这应该会为您的错误显示更详细的输出,您可能会找到原因。
  • @Tschitsch 我测试它但得到这个错误
  • 你使用的是什么版本的 Laravel? 5.6.30 之后有一些变化可能会导致这种情况。查看升级指南了解更多信息laravel.com/docs/5.6/upgrade#upgrade-5.6.30

标签: laravel


【解决方案1】:

你必须设置一个新闻 Key Generate 因为

php artisan key:generate

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

php artisan serve

【讨论】:

  • 为什么有必要这样做?
  • 因为 cookie 与应用程序密钥相关联,如果您更改密钥,就像您的应用再次没有 cookie 一样
  • 它会使所有用户的会话无效吗?他们的会话存储在数据库中?
【解决方案2】:

我也遇到过同样的问题。我经常在 Homestead-vagrant 环境中遇到这个问题。 在 Laravel 5.4,5.5,5.6 或更高版本中解决这个问题 -

php 工匠配置:清除

php 工匠视图:清除

php 工匠密钥:生成

【讨论】:

  • php artisan config:clear 可能需要也可能不需要,具体取决于您的设置。我不需要那个,但我确实需要下 2 个。
【解决方案3】:

在 App\Exceptions\Handler 下的 render 函数中使用这个 sn-p,它会重置浏览器 cookie。

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

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

【讨论】:

    【解决方案4】:

    当我将 Laravel 5.5 应用程序升级到 5.6 时,我遇到了同样的错误。错误来自EncryptCookies-Middleware。

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

    【讨论】:

      【解决方案5】:

      你应该做的第一件事是清除配置缓存文件

      php artisan config:clear
      

      然后为应用程序创建一个新密钥

      php artisan key:generate
      

      最后,重启服务器。希望能解决你的问题。

      【讨论】:

        【解决方案6】:

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

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

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

        但我尝试使用 decrypt() 进行解密

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

        正确的方法是

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

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

        【讨论】:

          【解决方案7】:

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

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

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

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

          Privacy setting and an indication where the user to click

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

          【讨论】:

            【解决方案8】:

            当我碰巧更新我的作曲家时,我也遇到了这个问题。 如果你把

            protected static $serialize = true;
            

            在 App\Http\Middleware\EncryptCookies 中,旧的 cookie 会破坏你的系统。所以为了防止这种情况,你要么必须清除 cookie,要么只是不反序列化解密的 cookie。

            我为此做了一个解决方法: 在 vendor/laravel/framework/src/Illuminate/Encryption/Encrypter.php 里面 上面这行decrypt()函数:

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

            添加:

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

            这可能很难看,但你可以暂时把它放在那里,直到你认为旧的 cookie 已经消失了。

            【讨论】:

            • 有趣。但是为什么不直接删除浏览器中的旧cookie呢?
            • @molerat 确定您可以只清除 cookie,但如果您的网站已对许多用户公开,那么您可能不想打断他们的体验。
            • 好点。没有考虑这一点,因为此时我的环境仍然是本地和私有的。
            • 当您更新 laravel 时,您的修复将不起作用,因为更新将擦除我们的更改(在供应商目录中)。此答案适用于 localhost hello world 应用程序,但适用于生产应用程序
            • @abbood 是的,这就是为什么我说这是一个临时修复,直到您的用户的旧 cookie 消失。否则,您可以覆盖此方法以使其成为永久修复。
            【解决方案9】:

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

            $ cd project_root
            $ rm composer.lock
            $ composer install
            

            【讨论】:

            • 在 Laravel 5.5 中为我工作
            • 只删除 composer.lock 绝不是一个好主意。当您在桌面上使用 hello world 应用程序时,这可能有效,但在生产应用程序上无效。在此处查看更多详细信息:stackoverflow.com/a/49593368/766570
            • 我一直这样做。如果您在 composer.json 中正确地固定了版本,那根本不成问题。至少从我的经验来看。
            • 通常在 composer.json 中,您不会指定依赖项的确切版本,而是指定最低版本及更高版本。如果没有 composer.lock,运行 composer install 将安装特定依赖项的最新稳定版本,它可能不再适用于您的应用程序。
            • 我知道并且我同意。通常我不会登录生产并删除composer.lock或任何文件并执行composer install。
            【解决方案10】:

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

            立即修复: 我试图回滚到上一个提交,但问题仍然存在,这意味着问题可能来自客户端,可能是 cookie。我尝试删除 cookie,但问题消失了。

            后来,我花了很多时间寻找这个问题,但一无所获,直到我今天再次遇到这个问题,通过另一个部署,我在 Laravel news about the security fix 5.6.30 更新上找到了这篇文章。如果我尝试为已经使用 > v5.6.30 并且已经创建 cookie(未序列化)的项目部署 laravel v5.6.26 的先前(

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

            From the upgrade guide:

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

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

            希望这会有所帮助。

            最佳,

            【讨论】:

            • 我可以通过清除作曲家的缓存来永久解决这个问题你用来做那个的命令是什么? composer dump-autoload?
            【解决方案11】:

            是的,对于本地主机,您可以只删除 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 测试。

            【讨论】:

              【解决方案12】:

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

              【讨论】:

                【解决方案13】:

                你只会在终端中运行

                composer global update
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-02-02
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-10-28
                  相关资源
                  最近更新 更多