PHP serialize вьюер
Розібрати serialize()-рядок із сесії, кеша або БД
Дані надсилаються на сервер, але не зберігаються
Цей інструмент не можна виконати у браузері, тому введені дані надсилаються на наш сервер. Ми обробляємо їх у пам'яті та одразу повертаємо результат: нічого не записується в базу, у файли чи в логи, нічого не передається третім сторонам. Та все ж не вставляйте сюди справжні робочі паролі чи ключі - для чутливих даних краще скористатися локальними інструментами.
Що таке serialize()
serialize() перетворює будь-яке значення PHP - масив, об'єкт, число - на рядок, який потім можна покласти в базу, у файл або в кеш. unserialize() робить зворотну операцію.
Формат читається очима, якщо знати позначення:
a:2:{s:4:"name";s:5:"Тарас";i:0;b:1;}
│ │ │ │
│ │ │ └─ значення: рядок довжиною 5
│ │ └────────── ключ: рядок довжиною 4
│ └───────────── кількість елементів
└─────────────── тип: a=array, s=string, i=int, b=bool, d=float, N=null, O=object
Довжина рядків рахується в байтах, не в символах. Тому «Тарас» - це s:10, а не s:5: п'ять кириличних літер займають десять байтів. Це найчастіша причина «пошкодженого» serialize-рядка після необережного str_replace або зміни кодування колонки.
Де ви зустрінете це в Laravel
- Сесії: драйвери
file,databaseтаredisзберігають дані сесії серіалізованими. - Кеш: усе, що не є простим рядком, лягає в кеш через
serialize(). - Черги: тіло задачі серіалізується перед відправкою у Redis чи базу.
- Каст
array: у моделях Laravel використовує JSON, а не serialize - і це свідомо краще. - Старий код: колонки з
serialize($data)замість JSON досі трапляються в legacy-проєктах.
Головна небезпека: object injection
unserialize() створює об'єкти. Якщо дані прийшли ззовні, зловмисник може підсунути рядок, який створить об'єкт довільного класу з довільними властивостями. Далі спрацює магічний метод - __wakeup(), __destruct(), __toString() - і код виконається.
Це не теоретична вразливість: саме так ламали Magento, WordPress-плагіни та десятки Laravel-проєктів, які приймали serialize від клієнта.
// Небезпечно, якщо $input прийшов від користувача
$data = unserialize($input);
// Безпечно: об'єкти не створюються взагалі
$data = unserialize($input, ['allowed_classes' => false]);
// Або дозволити лише конкретні класи
$data = unserialize($input, ['allowed_classes' => [Money::class]]);
Цей інструмент працює саме з allowed_classes: false, тому вставити сюди чужий serialize-рядок безпечно: об'єкт покажеться як дані з ім'ям класу, але нічого не виконається.
serialize чи JSON
Для нових даних - майже завжди JSON.
| serialize | JSON | |
|---|---|---|
| Читається людиною | ні | так |
| Читається іншою мовою | ні | так |
| Зберігає типи PHP точно | так | ні (об'єкти стають масивами) |
| Ризик object injection | так | ні |
| Запити всередину колонки в БД | ні | так (-> у MySQL і PostgreSQL) |
Останній рядок вирішальний: JSON-колонку можна фільтрувати запитом, serialize - тільки витягнути й розпакувати в PHP.
// JSON-каст: працює як масив, зберігається як JSON, шукається запитом
protected function casts(): array
{
return ['settings' => 'array'];
}
User::where('settings->theme', 'dark')->get();
serialize виправданий там, де важливо відновити значення точно таким, яким воно було, - наприклад, тіло задачі в черзі, де об'єкт має ожити тим самим класом.
- Де виконується
- на сервері
- Категорія
- Дані та формати