PHP - Фильтрация при désérialisation
Введение
Здравствуйте! Добро пожаловать в наше путешествие в мир программирования на PHP. Сегодня мы погрузимся в тему, которая может быть как захватывающей, так и немного пугающей для начинающих: 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 доступны два основных типа фильтров:
-
Опции: Этих используются для управления поведением
unserialize()
. Например, вы можете использовать опциюUNSERIALIZE_THROW_ON_INVALID
, чтобы выбросить исключение, если данные нельзя désérialiser. - Каллбэки: Это пользовательские функции, которые можно использовать для выполнения自定义 проверки или преобразований на 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