Ответ 1
Я получил ту же ошибку, когда обновляю приложение Laravel 5.5 до 5.6. Ошибка возникает из EncryptCookies
-Middleware.
Удалите файлы cookie в своем браузере и/или очистите файлы сеанса в своем приложении Laravel.
Я хочу запустить мое приложение в localhost с помощью php artisan serve
но я получаю эту ошибку unserialize(): Error at offset 0 of 40 bytes
где моя проблема?
Я получил ту же ошибку, когда обновляю приложение Laravel 5.5 до 5.6. Ошибка возникает из EncryptCookies
-Middleware.
Удалите файлы cookie в своем браузере и/или очистите файлы сеанса в своем приложении Laravel.
Вы должны установить новостной ключ Generate, потому что
php artisan key:generate
После этого теста снова запустить приложение Laravel
php artisan serve
Я столкнулся с той же проблемой. Я часто сталкивался с этой проблемой в Бродячей среде. Чтобы решить эту проблему в Laravel 5.4,5.5,5.6 или более -
Конфигурация PHP Artisan: очистить
php artisan view: очистить
Ключ ремесленника php: генерировать
Я получил ту же ошибку пару дней назад, когда я подтолкнул производственное обновление к моему проекту Laravel от Envoyer.
Немедленное исправление: я попытался откат к предыдущей фиксации, но проблема осталась, что означает, что проблема возникла с клиентской стороны, возможно, файлы cookie. Я попытался удалить файлы cookie, и проблема исчезла.
Позже, я потратил много времени на поиск этой проблемы, но ничего не получил, пока не столкнулся с этой проблемой снова с другим развертыванием, и я нашел эту статью в новостях Laravel об исправлении безопасности 5.6.30. Я смог определить, что эта проблема возникает, если я пытаюсь развернуть предыдущую (<5.6.30) версию laravel v5.6.26 для проекта, который уже использовал> v5.6.30, и файлы cookie уже были созданы (не serliazed), которые когда <5.6.30 версия фреймворка пытается сгладить результаты с ошибкой, потому что они не сортируются должным образом.
Настройка сериализации файлов cookie Поскольку эта уязвимость не может быть использована без доступа к ключу шифрования приложения, мы решили предоставить способ повторно включить шифрованную сериализацию файлов cookie, пока вы совместите свое приложение с этими изменениями. Чтобы включить/отключить сериализацию файлов cookie, вы можете изменить свойство static serialize промежуточного ПО App\Http\Middleware\EncryptCookies:
Я смог исправить эту проблему навсегда, очистив кэш композитора, чтобы заставить его загружать последнюю версию фреймворка вместо того, чтобы возвращаться в кеш.
Надеюсь это поможет.
Bests,
Просто осмотрите элемент в Браузере, перейдите на вкладку приложения, выберите cookie и удалите все cookie. Это.
В моем случае я удалил свой composer.lock
и установил composer install
и вуаля...
$ cd project_root
$ rm composer.lock
$ composer install
В 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);
}
Я также столкнулся с этой проблемой, когда мне довелось обновить моего композитора. Если вы поставите
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;
}
Это может быть некрасиво, но вы можете временно положить его туда, пока не решите, что старые куки исчезли.
да, для 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.
вы просто запустите в терминале
composer global update