(PHP 4, PHP 5, PHP 7, PHP 8)
unserialize — Crea una variable PHP a partir de un valor serializado
unserialize() toma una variable serializada (ver serialize()) y la convierte en una variable PHP.
No se debe pasar una entrada de usuario no confiable a la función
unserialize() independientemente del valor de
allowed_classes
en options
.
La deserialización puede resultar
en la ejecución de código cargado y ejecutado durante la instanciación
y la autocarga de objetos, y así, un usuario malintencionado
podría ser capaz de explotar este comportamiento. Utilice un estándar de intercambio
seguro, como JSON (a través de las funciones json_decode()
y json_encode()) si necesita pasar datos serializados
al usuario.
Si necesita deserializar datos serializados almacenados externamente, considere el uso de hash_hmac() para validar los datos. Asegúrese de que los datos no hayan sido modificados por nadie más que usted.
data
La cadena serializada.
Si la variable deserializada es un objeto, después de reconstruirlo con éxito, PHP intentará automáticamente llamar a los métodos __unserialize() o __wakeup (si alguno de ellos existe).
Nota: Directiva unserialize_callback_func
La retrollamada especificada en la directiva unserialize_callback_func es llamada cuando una clase no definida es deserializada. Si no se especifica ninguna retrollamada, el objeto será instanciado como __PHP_Incomplete_Class.
options
Cualquier opción a proporcionar a unserialize(), en forma de un array asociativo.
Nombre | Tipo | Descripción |
---|---|---|
allowed_classes |
array|bool |
Puede ser un array de nombres de clases que deben ser aceptados, false
para no aceptar ninguna clase, o true para aceptar todas las
clases. Si esta opción está definida, y
unserialize() encuentra un objeto de una clase
que no está aceptada, entonces el objeto será instanciado como
__PHP_Incomplete_Class.
Omitir esta opción equivale a definirla como true :
PHP intentará instanciar objetos de cualquier clase.
|
max_depth |
int |
La profundidad máxima permitida de las estructuras durante la deserialización,
que está destinada a prevenir desbordamientos de pila. El límite de profundidad
por defecto es de 4096 y puede ser desactivado definiendo
max_depth a 0 .
|
El valor convertido es retornado por la función, y puede ser de tipo booléen, entier, nombre décimal, chaîne de caractères, tableau o objet.
Si la cadena pasada no puede ser deserializada, esta función retorna
false
y se emite un error E_WARNING
.
Los objetos pueden lanzar Throwables en su gestor de deserialización.
A partir de PHP 8.4.0, si el elemento allowed_classes
de
options
no es un array de nombres de clases,
unserialize() lanza TypeError
y ValueError.
Versión | Descripción |
---|---|
8.4.0 |
Ahora lanza TypeError y
ValueError si el elemento allowed_classes
de options no es un array de nombres de clases.
|
8.3.0 |
Ahora emite un E_WARNING cuando la cadena de entrada contiene datos no consumidos.
|
8.3.0 |
Ahora emite un E_WARNING cuando la cadena proporcionada no es deserializable;
previamente, se emitía un E_NOTICE .
|
7.4.0 |
Se agregó el elemento max_depth a
options para definir la profundidad
máxima permitida de las estructuras durante la deserialización.
|
7.1.0 |
El elemento allowed_classes de
options ahora está estrictamente tipado, es decir, si
se proporciona algo que no sea un array array o un bool
unserialize() retorna false y emite una
E_WARNING .
|
Ejemplo #1 Ejemplo con unserialize()
<?php
// Aquí, se utiliza <function>unserialize</function> para cargar los datos de sesión
// desde la base de datos, en $session_data. Este ejemplo complementa
// el proporcionado con <function>serialize</function>.
$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)) {
// si la preparación o la lectura fallan, se crea un array vacío
$session_data = array();
} else {
// los datos guardados están en $tmp[0].
$session_data = unserialize($tmp[0]);
if (!is_array($session_data)) {
// Error... inicialización de un array vacío
$session_data = array();
}
}
?>
Ejemplo #2 Ejemplo con la directiva unserialize_callback_func
<?php
$serialized_object='O:1:"a":1:{s:5:"value";s:3:"100";}';
ini_set('unserialize_callback_func', 'mycallback');
function mycallback($classname)
{
// Simplemente incluya un archivo que contenga su definición de clase
// sabrá qué clase gracias a $classname
var_dump($classname);
}
unserialize($serialized_object);
?>