unserialize(): Ошибка при смещении 0 из 40 байтов Ошибка

Я хочу запустить мое приложение в localhost с помощью php artisan serve но я получаю эту ошибку unserialize(): Error at offset 0 of 40 bytes где моя проблема?

Ответ 1

Я получил ту же ошибку, когда обновляю приложение Laravel 5.5 до 5.6. Ошибка возникает из EncryptCookies -Middleware.

Удалите файлы cookie в своем браузере и/или очистите файлы сеанса в своем приложении Laravel.

Ответ 2

Вы должны установить новостной ключ Generate, потому что

php artisan key:generate

После этого теста снова запустить приложение Laravel

php artisan serve

Ответ 3

Я столкнулся с той же проблемой. Я часто сталкивался с этой проблемой в Бродячей среде. Чтобы решить эту проблему в Laravel 5.4,5.5,5.6 или более -

Конфигурация PHP Artisan: очистить

php artisan view: очистить

Ключ ремесленника php: генерировать

Ответ 4

Я получил ту же ошибку пару дней назад, когда я подтолкнул производственное обновление к моему проекту Laravel от Envoyer.

Немедленное исправление: я попытался откат к предыдущей фиксации, но проблема осталась, что означает, что проблема возникла с клиентской стороны, возможно, файлы cookie. Я попытался удалить файлы cookie, и проблема исчезла.

Позже, я потратил много времени на поиск этой проблемы, но ничего не получил, пока не столкнулся с этой проблемой снова с другим развертыванием, и я нашел эту статью в новостях Laravel об исправлении безопасности 5.6.30. Я смог определить, что эта проблема возникает, если я пытаюсь развернуть предыдущую (<5.6.30) версию laravel v5.6.26 для проекта, который уже использовал> v5.6.30, и файлы cookie уже были созданы (не serliazed), которые когда <5.6.30 версия фреймворка пытается сгладить результаты с ошибкой, потому что они не сортируются должным образом.

  • Установка laravel/framework (v5.6.26) Загрузка из кеша

Из руководства по обновлению:

Настройка сериализации файлов cookie Поскольку эта уязвимость не может быть использована без доступа к ключу шифрования приложения, мы решили предоставить способ повторно включить шифрованную сериализацию файлов cookie, пока вы совместите свое приложение с этими изменениями. Чтобы включить/отключить сериализацию файлов cookie, вы можете изменить свойство static serialize промежуточного ПО App\Http\Middleware\EncryptCookies:

Я смог исправить эту проблему навсегда, очистив кэш композитора, чтобы заставить его загружать последнюю версию фреймворка вместо того, чтобы возвращаться в кеш.

Надеюсь это поможет.

Bests,

Ответ 5

Просто осмотрите элемент в Браузере, перейдите на вкладку приложения, выберите cookie и удалите все cookie. Это.

enter image description here

Ответ 6

В моем случае я удалил свой composer.lock и установил composer install и вуаля...

$ cd project_root
$ rm composer.lock
$ composer install

Ответ 7

В 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);
}

Ответ 8

Я также столкнулся с этой проблемой, когда мне довелось обновить моего композитора. Если вы поставите

protected static $serialize = true;

внутри App\Http\Middleware\EncryptCookies, старый cookie сломает вашу систему. Поэтому, чтобы предотвратить это, вы должны либо очистить cookie, либо просто не десериализировать дешифрованный cookie.

Я сделал обходной путь для этого: Внутренний поставщик /Laravel/Framework/SRC/Освещение/Шифрование /Encrypter.php Над этой строкой функции decrypt():

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

добавить:

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

Это может быть некрасиво, но вы можете временно положить его туда, пока не решите, что старые куки исчезли.

Ответ 9

да, для localhost вы можете просто удалять файлы cookie, но для производства поместите это в обработчик ошибок, чтобы пользователи не увидели whoops:

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.

Ответ 10

вы просто запустите в терминале

composer global update