Рубрики
Uncategorized

Проблемы с сериализацией файлов cookie, возникшие после обновления Laravel 5.5 до версии 5.5.42

Автор оригинала: 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) мы узнали, что новая версия 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”.: