unserialize
(PHP 4, PHP 5, PHP 7, PHP 8)
unserialize —
Создаёт PHP-значение из хранимого представления
Описание
Функция unserialize() принимает одну сериализованную переменную
и конвертирует её обратно в PHP-значение.
Внимание
Нельзя передавать в функцию unserialize() ненадёжные пользовательские
входные данные независимо от значения опции allowed_classes
в параметре options.
При десериализации функция воссоздаёт объекты и автоматически загружает классы,
что ведёт к риску загрузки и выполнения кода, чем пользуются злоумышленники.
Вместо этого пользуются безопасным стандартным форматом обмена данными наподобие JSON,
который обрабатывают функциями json_decode() и json_encode(),
если сериализованные данные требуется передать клиенту.
Данные проверяют функцией hash_hmac(),
когда требуется десериализовать значение, которое хранится во внешнем источнике.
Разработчики проверяют, что данные никто не изменил, кроме них самих.
Список параметров
data
-
Сериализованная строка.
После восстановления объекта, который хранит переменная,
PHP автоматически вызовет магические методы
__unserialize()
и __wakeup(), если эти методы определили в классе
и при десериализации не возникло ошибок.
Замечание:
Директива
unserialize_callback_func
Callback-функция, которую указали в директиве unserialize_callback_func,
вызывается при десериализации неопределённого класса.
PHP создаст объект класса __PHP_Incomplete_Class,
если callback-функцию не указали.
options
-
Ассоциативный массив опций
для функции unserialize().
Допустимые опции
| Имя |
Тип |
Описание |
allowed_classes |
array|bool |
Опция принимает либо массив (array) с названиями классов, которые примет функция,
либо значение false, чтобы функция не принимала никакие классы,
либо значение true, чтобы функция принимала все классы. Вместо объекта, класс которого не разрешали принимать,
функция unserialize() создаст объект класса __PHP_Incomplete_Class,
если опцию определили и функция встретит неразрешённый объект класса.
Пропуск опции равносилен определению значения true: PHP
попытается создать объекты любого класса.
Опция не влияет на перечисления.
|
max_depth |
int |
Опция устанавливает глубину структур, которую функции разрешается десериализовать,
чтобы предотвратить переполнение стека.
По умолчанию ограничение глубины составляет 4096 уровней
и отключается путём установки для опции max_depth значения 0.
|
Возвращаемые значения
Функция возвращает результат преобразования в виде значения
bool, int,
float, string,
array или object.
Функция возвращает значение false и выдаёт ошибку уровня E_WARNING,
если строка не поддаётся десериализации.
Ошибки
Лучше предусмотреть обработку исключений Throwable,
которые объекты иногда выбрасывают в своих обработчиках десериализации.
Начиная с PHP 8.4.0 функция unserialize()
выбрасывает ошибки TypeError и ValueError,
если в элементе allowed_classes параметра options
передали не массив (array) с названиями классов.
Примеры
Пример #1 Пример воссоздания PHP-значения их хранимого представления функцией unserialize()
<?php
// Вызовем функцию unserialize(), чтобы загрузить данные сессии в массив
// $session_data из строки, которую извлекли из базы данных.
// Этим примером дополняется пример, который описывает документация функции serialize()
$conn = odbc_connect("webdb", "php", "chicken");
$stmt = odbc_prepare($conn, "SELECT data FROM sessions WHERE id = ?");
$sqldata = array($_SERVER['PHP_AUTH_USER']);
if (!odbc_execute($stmt, $sqldata) || !odbc_fetch_into($stmt, $tmp)) {
// Инициализируем пустой массив, если выполнение запроса или извлечение данных завершилось ошибкой
$session_data = array();
} else {
// Элемент $tmp[0] теперь содержит сериализованные данные
$session_data = unserialize($tmp[0]);
if (!is_array($session_data)) {
// Что-то пошло не так, инициализируем пустой массив
$session_data = array();
}
}
Пример #2 Пример установки callback-функции через директиву unserialize_callback_func
<?php
$serialized_object='O:1:"a":1:{s:5:"value";s:3:"100";}';
ini_set('unserialize_callback_func', 'mycallback'); // Устанавливаем свою callback-функцию
function mycallback($classname)
{
// Просто подключаем файл с определением класса;
// переменная $classname указывает, определение какого класса требуется
var_dump($classname);
}
unserialize($serialized_object);
Примечания
Внимание
Значение false возвращается как при ошибке, так и при десериализации
сериализованного значения false. Этот случай отлавливают
путём сравнения значения аргумента data со значением,
которое возвращает вызов serialize(false), или путём перехвата
ошибки уровня E_WARNING.