PHP unserialize: decodificar opciones WordPress y datos serializados

PHP unserialize: decodificar opciones WordPress y datos serializados

Deserializa `wp_postmeta` de WordPress, sesiones PHP y caches Laravel a JSON legible en el navegador — solo arrays y escalares, sin script local.

31.08.2026
9 min de lectura
Compartir este artículo:
PHPDeserializaciónWordPressDepuraciónSerializaciónTutorial

Decodificar PHP serializado en lugar de leer tokens en bruto

Un option_value de WordPress, un wp_postmeta.meta_value, un blob de sesión PHP o un volcado de caché de Laravel suele llegar al editor como a:3:{s:8:"blogname";…}. Esa cadena es la salida de serialize() de PHP. No es JSON ni un bundle minificado. El deserializador PHP en línea convierte los tokens de arrays y escalares en JSON legible (o en sintaxis de array PHP), dentro del navegador. No ejecuta PHP, no instancia objetos de clase y no sube el payload. Este artículo explica cómo depurar: dónde viven esos blobs, cómo pegarlos con seguridad y cuándo sigue haciendo falta PHP nativo. Para el formato de serialización, la comparación con JSON y la inyección de objetos, empieza por la guía de serialización PHP. Los recursos front del mismo sitio WordPress son otro trabajo, que cubre la minificación WordPress.

Inspeccionar wp_options, postmeta y transients sin un script PHP local
Salida en JSON o array PHP, con sangría de 2 espacios por defecto, y nada sale de la pestaña
Solo arrays y escalares: los objetos de tipo O y las referencias de tipo R se rechazan
Más seguro que unserialize() de PHP sobre un dump desconocido: sin ejecución de objetos
Ida y vuelta de arrays vía php-serialize tras editar el JSON legible

Serialize y unserialize, dos herramientas para un mismo volcado de WordPress

serialize() escribe y unserialize() lee, por eso FastMinify tiene dos páginas distintas

PHP serialize() emite una cadena con tipos. unserialize() reconstruye el valor. FastMinify replica esa división: php-serialize codifica JSON o sintaxis de array PHP en tokens a:/s:/i:; php-unserialize los decodifica. No pegues un blob serializado en el serializador, ni JSON en el deserializador. Las utilidades vecinas están en el hub de utilidades para desarrolladores.

Página unserialize: pega a:…, s:…, i:…, d:…, b:…, N;
Página serialize: pega JSON o sintaxis array(…) / => (ver PHP serialize en línea)
Formato de salida unserialize: JSON (por defecto) o sintaxis de array PHP
El JSON con sangría sirve para leer. Para obtener JSON compacto, cópialo y pásalo por el minificador JSON en línea
Un JS minificado de un plugin no es serialize(): usa un desminificador JavaScript en línea
Dónde WordPress guarda de verdad serialize()

El core y muchos plugins llaman a maybe_serialize() / maybe_unserialize(). Si el valor es un array PHP (o un objeto), se guarda en MySQL como una cadena serialize(). Los escalares (cadenas, números) se quedan como están, así que no todas las filas empiezan por a:.

wp_options.option_value: nombre del sitio, permalinks, instancias de widgets, ajustes de plugins
wp_postmeta.meta_value: tamaños de adjuntos, campos personalizados, constructores de páginas
wp_usermeta / wp_commentmeta: el mismo patrón, por usuario o comentario
Los transients (_transient_*) suelen contener un array, y la fecha de caducidad está en una opción aparte
Si la celda empieza por O: seguido de un nombre de clase, FastMinify la rechaza: es un objeto de plugin, no un array
unserialize() de PHP es un límite de seguridad, y la herramienta del navegador no es PHP

En PHP, unserialize() sobre una entrada no fiable puede instanciar objetos y activar cadenas de gadgets (inyección de objetos). FastMinify lee el formato en JavaScript. Nunca ejecuta PHP y no decodifica ni los objetos de clase O: ni las referencias R:. Es un límite y a la vez una garantía de seguridad. Úsalo para inspeccionar volcados de arrays. Que el decode funcione no significa que el payload sea seguro para pasarlo a unserialize en producción.

Dump desconocido: inspecciónalo primero en el navegador, sin subida ni proceso PHP
Si debes decodificar en PHP: unserialize($s, ['allowed_classes' => false]) (PHP 7+)
Nunca ejecutes con eval ni con wp-cli eval un blob copiado de un ticket
Los volcados de opciones pueden contener claves de API, así que una pestaña local es más segura que un deserializador en línea que envía los datos a un servidor

Qué acepta el parser y cómo se ve una fila de WordPress

Prefijos de tipo en un option_value típico

Cada token empieza por una letra. El deserializador de FastMinify acepta el mismo subconjunto que puede serializar: null, bool, int, float, cadena, array anidado. Objetos y referencias son errores, no omisiones silenciosas.

Antes

a:3:{s:8:"blogname";s:10:"FastMinify";s:11:"description";s:22:"Local developer tools.";s:7:"WPLANG";s:5:"en_US";}

Después

{ "blogname": "FastMinify", "description": "Local developer tools.", "WPLANG": "en_US" }
a:N:{…}: array con N pares clave/valor (asociativo o indexado)
s:n:"…" es una cadena, y su número indica la longitud en bytes, no la de caracteres UTF-8
i: entero, d: float, b:0/b:1 bool, N; null
O:8:"stdClass" y R: / r: no se decodifican aquí
Una cadena cortada como s:3:"hello", sin el punto y coma final, falla en lugar de corromper el resto del array. La herramienta no compara el número con la longitud del texto, así que compruébalo en PHP cuando importe
Leer un array anidado de wp_postmeta

Los metadatos de adjuntos y algunos campos personalizados (los campos de relación o de casillas de ACF, por ejemplo) son arrays de enteros y cadenas. Es justo el subconjunto que maneja este parser. Pega la celda, pulsa Deserializar y copia el JSON.

Antes

a:2:{s:5:"width";i:1200;s:6:"height";i:630;}

Después

{ "width": 1200, "height": 630 }
phpMyAdmin / TablePlus: copia la celda cruda, no la vista recortada
WP-CLI wp option get … --format=json ya deserializa en PHP, así que usa FastMinify cuando solo tengas el dump SQL
Tras decodificar, la barra de herramientas ofrece JSON (por defecto) o sintaxis de array PHP, además del tamaño de sangría y de espacios o tabulaciones
Los filtros opcionales (quitar nulls, arrays vacíos y objetos vacíos, u ordenar claves) cambian el payload, así que déjalos desactivados para una inspección fiel
JSON compacto para un ticket: minificador JSON en línea sobre la salida copiada
Sesiones, cachés de Laravel y el límite de los objetos

Los archivos de sesión de PHP y algunos controladores de caché de Laravel guardan payloads serialize(). Si el valor es un array de escalares, la herramienta funciona en el navegador. Si es un modelo Eloquent, una instancia de Carbon o cualquier clase O:, FastMinify devuelve un error claro. Es lo esperado: la herramienta no finge ser el unserialize de PHP.

Un Cache::put de Laravel con un array plano suele dar a:, así que pega y decodifica
Los modelos Eloquent de Laravel y los DTO propios dan O:: decodifícalos en PHP con una allowlist, no aquí
Las cookies cifradas y los payloads de encrypt() no son serialize(): descífralos antes en la aplicación
Los cachés en igbinary o JSON no son serialize() de PHP, así que revisa el controlador antes de pegar
La misma honestidad que la doc de la herramienta: no O:, no R:, no ejecución de objetos

Deserializar en el navegador con un ejemplo concreto de WordPress

Usar el deserializador PHP

Abre el deserializador PHP, pega una sola cadena serializada y pulsa Deserializar. La salida es JSON por defecto (sangría de 2 espacios). Cambia a la sintaxis de array PHP si vas a pegar el resultado en un fragmento de código. Todo se queda en la pestaña, sin cuenta y sin viaje al servidor.

Aceptados: null, booleanos, enteros, floats, cadenas y arrays anidados
Rechazados: objetos de clase de tipo O, referencias de tipo R y cadenas truncadas. El número que indica la longitud no se comprueba
Opciones: salida en JSON o en array PHP, incluir nulls (activado por defecto), quitar arrays y objetos vacíos, ordenar claves, tamaño de sangría, espacios o tabulaciones
No es una herramienta de migración SQL para WordPress: no cambies a mano las longitudes de las cadenas en un dump
Una instancia de widget en wp_options

Un widget de la barra lateral se muestra vacío tras una migración. La opción widget_* es un array serializado. Necesitas ver qué claves sobrevivieron, no adivinar desde una celda de 400 caracteres.

1

1. Copiar el option_value en bruto

Desde SQL o WP-CLI, copia la cadena completa a partir de a:. Las vistas previas recortadas con … no se podrán analizar.

2

2. Pegar en php-unserialize

Abre php-unserialize y deja la salida en JSON. Si ves un error de formato desconocido en O:, el widget guardó un objeto. Detente aquí y usa PHP con allowed_classes.

3

3. Editar el JSON y volver a serializar solo si debes escribir de vuelta

Corrige las claves en el JSON y vuelve a codificarlo con php-serialize. Esta ida y vuelta vale para los arrays y escalares que admite este parser. El resultado no coincide byte a byte con la cadena original de WordPress (orden de las claves, espacios). Prefiere WP-CLI wp option update con JSON cuando puedas.

Un volcado de caché de Laravel en Redis

Redis muestra un valor que empieza por a:. Quieres saber qué claves de configuración hay en el payload antes de borrar la clave.

1

1. Copiar el valor como texto sin formato

redis-cli escapa las comillas dentro de un valor salvo en modo raw, así que copia el valor como texto sin formato. Si hay algo antes del primer a: o s: (el controlador de caché de archivos de Laravel escribe primero una marca de caducidad), quítalo.

2

2. Decodificar en local

Pega el valor en el deserializador. Los arrays anidados se convierten en objetos o arrays JSON. Los nulls se conservan si la opción «Incluir valores null» está activa (valor por defecto).

3

3. Dejar a PHP los payloads de objetos

Un token de clase Illuminate\… dará error. Es la herramienta comportándose como se documenta, no un volcado de Redis roto.

Cuándo sigues necesitando PHP (y cómo hacer la ida y vuelta de arrays)

allowed_classes puesto a false, la comprobación en PHP

Si el blob contiene objetos, o estás en un script de despliegue, decodifica en PHP sin instanciar clases. Los objetos de clase incompleta te dan el nombre de la clase sin ejecutar constructores. FastMinify no sustituye esta protección.

Ejemplo básico

<?php // Inspeccionar un dump serialize() no fiable sin instanciar clases (PHP 7+). $raw = file_get_contents('option_value.txt'); $value = unserialize($raw, ['allowed_classes' => false]); var_export($value);
maybe_unserialize y WP-CLI en WordPress

El core de WordPress ya conoce el formato. maybe_unserialize() devuelve arrays, y WP-CLI imprime JSON, así que nunca editas a mano los prefijos de longitud. Usa FastMinify cuando solo tengas una exportación SQL o un texto pegado de un ticket. Después escribe de vuelta por las API de WordPress, no con un UPDATE directo sobre una cadena serialize() retocada.

Ejemplo básico

# Leer una opción como JSON (WordPress deserializa en PHP). wp option get widget_text --format=json # Actualizar desde un archivo JSON en lugar de parchear s:n:\"…\" en SQL. wp option update my_plugin_settings "$(cat settings.json)" --format=json
Ida y vuelta en el navegador, solo arrays

Decodifica con php-unserialize, edita el JSON y codifica con php-serialize. Los objetos JSON anidados se convierten en arrays PHP, no en objetos O:. Ordenar claves o quitar nulls y estructuras vacías cambia lo que escribes de vuelta. La documentación de la herramienta lo dice claro: no es una utilidad de migración SQL de WordPress exacta al byte. Para el CSS y el JS del mismo sitio, usa la guía de minificación WordPress, que es otro proceso.

Ejemplo básico

// Bucle en el navegador (solo arrays/escalares): // 1. Pegar cadena serialize() → php-unserialize → JSON // 2. Editar JSON // 3. Pegar JSON → php-serialize → nueva cadena a:… // No hagas UPDATE de wp_options con un prefijo s:n:"…" editado a mano.

Conclusión

Pega la cadena serialize(), lee el JSON y decide si el payload es un array que puedes convertir de ida y vuelta o un objeto que corresponde a PHP. FastMinify hace esa inspección en local y rechaza O:/R:. No es unserialize(), ni WP-CLI, ni una forma segura de buscar y reemplazar en volcados de MySQL. Para el detalle del formato, ten a mano la guía de serialización PHP.

Copia la celda entera, porque una cadena truncada falla al analizarse
Deja los payloads O: a PHP con allowed_classes puesto a false
No cambies a mano las longitudes de las cadenas en SQL
Ida y vuelta solo de arrays: unserialize → JSON → serialize
Mantén los dumps en el navegador; option_value puede contener secretos
Compartir este artículo
Compartir este artículo: