Недавно гандикап обновил второстепенный номер версии 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) мы узнали, что новая версия Laravel больше не выполняет автоматическую сериализацию и десериализацию значений файлов cookie, чтобы предотвратить использование уязвимости сериализации/десериализации объектов PHP.
Возьми каштан:
\Cookie::queue('user', ['id' => 1, 'name' => 'admin'], 720, '/')Laravel обновлен до версии 5.5.42, поскольку Laravel больше не сериализует автоматически значения файлов cookie [‘id’=> 1,’имя’=>’администратор’], в то время как openssl_encrypt (строка $данные…) может шифровать только строковые данные, а затем программа выдает ошибку: openssl_encrypt() ожидает, что параметр 1 будет строковым, УЧИТЫВАЯ Ven.
Растворитель:
- В новой версии статическое свойство $serialize добавлено в приложение промежуточного программного обеспечения Http Middleware для шифрования файлов cookie, которое может включать автоматическую сериализацию и десериализацию значений файлов cookie, если установлено значение true.
/** * Indicates if cookies should be serialized. * * @var bool */ protected static $serialize = true;
- [Рекомендация] Значение файла cookie кодируется в строку с помощью функции JSON, а затем сохраняется (после получения значения файла Cookie вызывается функция JSON для декодирования).
\Cookie::queue('user', json_encode(['id' => 1, 'name' => 'admin']), 720, '/');-ЭОФ-
Впервые опубликовано в колонке PHP и Laravel Learning: https://zhuanlan.zhihu.com/p/…
Проверьте код, чтобы обратить внимание на общедоступный номер Wechat” Обучение PHP и Laravel”.: