PHP - Фильтрация при désérialisation

Введение

Здравствуйте! Добро пожаловать в наше путешествие в мир программирования на PHP. Сегодня мы погрузимся в тему, которая может быть как захватывающей, так и немного пугающей для начинающих: unserialize() с фильтрами. Но не волнуйтесь, я проведу вас через это шаг за шагом, чтобы вы поняли все по ходу дела.

PHP - Filtered unserialize()

Что такое сериализация?

Прежде чем перейти к unserialize(), давайте сначала поймем, что такое сериализация. Сериализация - это процесс преобразования объекта или структуры данных в формат, который можно сохранить или передать, а затем позднее reconstruct. В PHP это часто делается с помощью функции serialize().

$data = array('a', 'b', 'c');
$serialized_data = serialize($data);
echo $serialized_data; // Выводит: a:3:{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";}

В этом примере у нас есть массив $data, который сериализуется в строку с помощью serialize(). Полученная строка может быть сохранена в базе данных или отправлена по сети.

Что такое désérialisation?

Désérialisation - это обратный процесс сериализации. Он принимает сериализованную строку и преобразует ее обратно в исходную форму. В PHP это делается с помощью функции unserialize().

$serialized_data = 'a:3:{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";}';
$data = unserialize($serialized_data);
print_r($data); // Выводит: Array ( [0] => a [1] => b [2] => c )

В этом примере мы берем сериализованную строку $serialized_data и преобразуем ее обратно в массив с помощью unserialize().

Что такое фильтры?

Теперь давайте поговорим о фильтрах. Когда вы работаете с désérialisé данными, важно убедиться, что данные безопасны и valid. Вот где на помощь приходят фильтры. Фильтры позволяют вам указать дополнительные правила для обработки данных в процессе désérialisation.

В PHP доступны два основных типа фильтров:

  1. Опции: Этих используются для управления поведением unserialize(). Например, вы можете использовать опцию UNSERIALIZE_THROW_ON_INVALID, чтобы выбросить исключение, если данные нельзя désérialiser.
  2. Каллбэки: Это пользовательские функции, которые можно использовать для выполнения自定义 проверки или преобразований на désérialisé данных.

Использование фильтров с unserialize()

Теперь, когда мы рассмотрели основы, давайте посмотрим, как мы можем использовать фильтры с unserialize(). Мы начнем с опционного фильтра.

Опционный фильтр

Опция UNSERIALIZE_OPTIONS позволяет вам указать дополнительные флаги, которые управляют поведением unserialize(). Вот пример:

$serialized_data = 'a:3:{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";}';
$options = ['options' => ['allowed_classes' => false]];
$data = unserialize($serialized_data, $options);

В этом примере мы установили опцию allowed_classes в false, что означает, что будут разрешены только коренные классы PHP. Если сериализованные данные содержат любой другой класс, будет выброшена ошибка.

Каллбэк фильтр

Каллбэк фильтр - это более продвинутая функция, которая позволяет вам определить свою собственную логику проверки или преобразования. Вот пример:

function my_callback($class, $data, $filter) {
if ($class === 'MyClass') {
return new MyClass($data);
}
return false;
}

$serialized_data = 'O:8:"MyClass":1:{s:4:"name";s:5:"Alice";}';
$data = unserialize($serialized_data, ['callback' => 'my_callback']);

В этом примере мы определили каллбэк функцию my_callback(), которая проверяет, является ли класс, который désérialisation, MyClass. Если да, она создает новый экземпляр MyClass с предоставленными данными. Если нет, она возвращает false, что приведет к сбою unserialize().

Заключение

Уф! Это было quite the ride, wasn't it? Надеюсь, теперь у вас есть лучшее понимание сериализации, désérialisation и того, как использовать фильтры с unserialize() в PHP. Помните, что практика делает perfect, так что вперед и попробуйте эти концепции с образцами данных. И не забывайте веселиться на ходу!

Credits: Image by storyset