Автор оригинала: David Wong.
Недавно небольшой номер версии laravel (v5.5.39 = > v5.5.45) в проекте был обновлен для отключения вручную. Если он не будет обновлен, у него возникнут проблемы, как только он будет обновлен!
Запрос об ошибке на платформе sentry: openssl_encrypt() ожидает, что параметр 1 будет строкой, задан массив. Конкретная запись об ошибке выглядит следующим образом:
ErrorException openssl_encrypt() expects parameter 1 to be string, array given vendor/laravel/framework/src/Illuminate/Encryption/Encrypter.php in handleError at line 91 vendor/sentry/sentry/lib/Raven/Breadcrumbs/ErrorHandler.php in handleError at line 34 vendor/sentry/sentry/lib/Raven/Breadcrumbs/ErrorHandler.php in openssl_encrypt vendor/laravel/framework/src/Illuminate/Encryption/Encrypter.php in encrypt at line 91 vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php in encrypt at line 139 vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php in handle at line 66 vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php in Illuminate\Pipeline\{closure} at line 149 vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php in Illuminate\Routing\{closure} at line 53 vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php in then at line 102 vendor/laravel/framework/src/Illuminate/Routing/Router.php in runRouteWithinStack at line 660 vendor/laravel/framework/src/Illuminate/Routing/Router.php in runRoute at line 635 vendor/laravel/framework/src/Illuminate/Routing/Router.php in dispatchToRoute at line 601 vendor/laravel/framework/src/Illuminate/Routing/Router.php in dispatch at line 590 vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php in Illuminate\Foundation\Http\{closure} at line 176 vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php in Illuminate\Routing\{closure} at line 30 vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php in handle at line 58 vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php in Illuminate\Pipeline\{closure} at line 149 vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php in Illuminate\Routing\{closure} at line 53 vendor/fideloper/proxy/src/TrustProxies.php in handle at line 56 vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php in Illuminate\Pipeline\{closure} at line 149 vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php in Illuminate\Routing\{closure} at line 53 vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php in handle at line 30 vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php in Illuminate\Pipeline\{closure} at line 149 vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php in Illuminate\Routing\{closure} at line 53 vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php in handle at line 30 vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php in Illuminate\Pipeline\{closure} at line 149 vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php in Illuminate\Routing\{closure} at line 53 vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php in handle at line 27 vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php in Illuminate\Pipeline\{closure} at line 149 vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php in Illuminate\Routing\{closure} at line 53 vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php in handle at line 46 vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php in Illuminate\Pipeline\{closure} at line 149 vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php in Illuminate\Routing\{closure} at line 53 vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php in then at line 102 vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php in sendRequestThroughRouter at line 151 vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php in handle at line 116 public/index.php at line 55
Внимательно проверьте приведенную выше запись стека исключений и отладьте точку останова. Окончательно установлено, что ошибка вызвана изменением логики шифрования файлов cookie после обновления laravel 5.5.
Согласно официальному документу laravel (Руководство по обновлению laravel 5.5), чтобы предотвратить использование уязвимости сериализации/десериализации объектов PHP, новая версия laravel больше не выполняет автоматическую сериализацию и десериализацию значений файлов cookie.
Вот каштан:
\Cookie::queue('user', ['id' => 1, 'name' => 'admin'], 720, '/')После обновления laravel до версии 5.5.42, поскольку laravel больше не выполняет автоматическую сериализацию значений файлов cookie [‘id ‘= > 1,’ имя ‘= > администратор’], openssl_encrypt (строка $данные…) может шифровать только строковые данные. В это время программа выдаст ошибку: openssl_encrypt() ожидает, что параметр 1 будет строковым, заданным массивом.
растворитель:
- В новой версии статическое свойство $serialize добавлено в приложение промежуточного программного обеспечения http промежуточного программного обеспечения encryptcookies. Если установлено значение true, можно включить автоматическую сериализацию и десериализацию значений файлов cookie.
/** * Indicates if cookies should be serialized. * * @var bool */ protected static $serialize = true;
- [рекомендуется] используйте функцию JSON для кодирования значения файла cookie в строку, а затем сохраните его (вызовите функцию JSON для декодирования после получения значения файла cookie).
\Cookie::queue('user', json_encode(['id' => 1, 'name' => 'admin']), 720, '/');-EOF-
Впервые опубликовано в колонке Zhihu PHP и laravel learning: https://xuanlan.zhihu.com/p/…
Отсканируйте код и следуйте общедоступной учетной записи wechat для обучения PHP и laravel:
Оригинал: “https://developpaper.com/cookie-serialization-problems-encountered-after-laravel-5-5-upgrade-to-5-5-42/”