unserialize
(PHP 4, PHP 5, PHP 7, PHP 8)
unserialize — Crea una variable PHP a partir de un valor serializado
Descripción
unserialize() toma una variable serializada
(ver serialize()) y la convierte en una variable PHP.
Advertencia
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.
Parámetros
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.
Opciones válidas
| 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.
Esta opción no afecta a las Enumeraciones.
|
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.
|
Valores devueltos
El valor convertido es retornado por la función, y puede ser un bool,
int, float, string,
array o object.
Si la cadena pasada no puede ser deserializada, esta función retorna
false y se emite un error E_WARNING.
Errores/Excepciones
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.
Ejemplos
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);
?>
Notas
Advertencia
false es retornado en los casos donde ocurre un error y si se
intenta deserializar un valor serializado igual a false. Es
posible interceptar este caso especial comparando
data con serialize(false)
o atrapando el error E_WARNING emitido.