Рубрики
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), чтобы предотвратить использование уязвимости сериализации/десериализации объектов 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/”