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

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

Вы им пользуетесь из коробки? Или в какой части кода появляется ошибка? Немного сложно помочь вам без кода или дополнительной информации.

René Höhle 13.08.2018 10:16

Как я могу объяснить свою проблему? Я просто получаю эту ошибку на всей странице приложения @Stony

Hanie Asemi 13.08.2018 10:19

попробуйте php artisan serve -vvv. Если вы увидите более подробный вывод вашей ошибки, вы, вероятно, сможете найти причину.

Tschitsch 13.08.2018 10:19

@Tschitsch Я тестирую, но получаю только эту ошибку

Hanie Asemi 13.08.2018 10:21

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

Tschitsch 13.08.2018 10:26

Какую версию Laravel вы используете? После версии 5.6.30 есть некоторые изменения, которые могут вызвать это. Обратитесь к руководству по обновлению для получения дополнительной информации laravel.com/docs/5.6/upgrade#upgrade-5.6.30

Adrian Hernandez-Lopez 13.08.2018 10:51

@ AdrianHernandez-Lopez версия моего laravel - 5.6, эта работа раньше, но теперь я получаю эту ошибку

Hanie Asemi 13.08.2018 13:27

@ AdrianHernandez-Lopez, ваш ответ поможет мне Я создал новый laravel и скопировал этот файл .env в этот проект, я удаляю файл .env и использую файл старой версии

Hanie Asemi 13.08.2018 13:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
56
8
55 842
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

Ответ принят как подходящий

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

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

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

php artisan key:generate

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

php artisan serve

Зачем это нужно?

molerat 04.03.2019 10:11

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

Robert Pounder 05.03.2019 10:44

Будет ли он аннулировать сеанс всех пользователей, сеанс которых хранится в базе данных?

prograshid 07.04.2021 12:16

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

да, для localhost вы можете просто удалить файлы 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.

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

Немедленное исправление: Я попытался откатиться к предыдущей фиксации, но проблема не исчезла, что означает, что проблема возникла на стороне клиента, вероятно, файлы 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) Загрузка из кеша

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

Configuring Cookie Serialization Since this vulnerability is not able to be exploited without access to your application's encryption key, we have chosen to provide a way to re-enable encrypted cookie serialization while you make your application compatible with these changes. To enable / disable cookie serialization, you may change the static serialize property of the App\Http\Middleware\EncryptCookies middleware:

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

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

Лучшие,

Я смог навсегда исправить эту проблему, очистив кеш композитора какую команду вы использовали для этого? composer dump-autoload?
abbood 27.08.2019 05:41

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

$ cd project_root
$ rm composer.lock
$ composer install

Работай для меня в Laravel 5.5

Sundbox 22.10.2018 10:04

Никогда не рекомендуется просто удалять composer.lock. Это может сработать, когда вы работаете с приложением hello world на рабочем столе, но не с рабочим приложением. Подробнее см. Здесь: stackoverflow.com/a/49593368/766570

abbood 20.08.2019 14:02

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

Shobi 20.08.2019 14:21

Обычно в composer.json вы указываете не точные версии зависимостей, а минимальную версию и выше. Без composer.lock при запуске composer install будет установлена ​​последняя стабильная версия конкретной зависимости, которая может больше не работать с вашим приложением.

pkid169 21.08.2019 07:13

Я знаю и согласен. И обычно я не буду входить в продакшн, удалять composer.lock или какой-либо другой файл и устанавливать композитор.

Shobi 21.08.2019 11:04

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

composer global update

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

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

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

php artisan view: ясно

php artisan key: сгенерировать

php artisan config: clear может понадобиться, а может и не понадобиться, в зависимости от ваших настроек. Этот мне не нужен, но мне нужны следующие 2.

Jay 06.12.2019 00:51

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

protected static $serialize = true;

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

Я сделал обходной путь для этого: Внутренний поставщик / 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 04.03.2019 10:14

@molerat уверен, что вы можете просто очистить свои файлы cookie, но если ваш сайт был общедоступным для многих пользователей, то, вероятно, вы не хотите прерывать их работу.

Nghia Le 05.03.2019 12:39

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

molerat 05.03.2019 13:13

ваше исправление не будет работать, когда вы обновите свой laravel, так как обновление сотрет ваши изменения (внутри каталога vendor). Этот ответ работает для приложений localhost hello world, но для производственных приложений

abbood 20.08.2019 14:04

@abbood да, поэтому я сказал, что это временное исправление, пока старые файлы cookie от ваших пользователей не исчезнут. Или вы можете переопределить этот метод, чтобы сделать это постоянным исправлением.

Nghia Le 22.08.2019 01:23

В моем случае я пытался расшифровать хеш с неправильной функцией.

Я создавал шифрование с помощью encryptString ()

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

но я пытался расшифровать с помощью decrypt ()

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

правильный путь

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

Поэтому, когда вы шифруете с помощью Crypt::encrypt(), вы должны расшифровать его с помощью Crypt::decrypt(), а для Crypt::encryptString() используйте Crypt::decryptString().

В моем случае произошло во время локальной разработки. Шаги, которые вызвали проблему:

  1. Я обновил latavel до 5.8 на отдельной ветке
  2. Я перешел в другую ветку с laravel 5.2 (в моем случае мне пришлось просмотреть PR)

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

В firefox это можно сделать, зайдя, затем выберите about:preferences#privacy и выберите соответствующий вариант. как показано на следующих изображениях (на греческом языке)

Настройка конфиденциальности и указание, где пользователь нажимаетSetting to clean its cookies as well

Другой подход для диагностики проблемы - открыть частный браузер Firefox или использовать режим chromesognito.

Другие вопросы по теме