El formato no tiene especificaciones fuera de la implementación; el Manual PHP para unserialize() es la referencia y es explícito que pasar información que no es de confianza no es seguro.
La primera vez que los datos de PHP serializados me costaron una tarde, fue un ticket de soporte de administración de WP. La configuración de un widget de panel de usuario se había descontrolado, y las "configuraciones" que estaban describiendo vivían en el wp_options Tabla como una sola cadena serializada que parecía ruido de línea: a:4:{s:8:"_builtin";b:1;.... No podía leerlo, no podía decir de un vistazo qué estaba mal, y no quería hacer girar un entorno PHP completo solo para print_r Una fila. Esa tarde es por lo que me importa tener un decodificador que esté a una pestaña de navegador de distancia.
Si trabaja en WordPress, WooCommerce, Laravel o cualquier base de código PHP heredado, ha conocido datos serializados, ya sea que desee o no. Aparece en tablas de opciones, archivos de sesión, tiendas de caché y POST Meta. Y cuando algo se rompe, poder leerlo rápido es la diferencia entre una solución de cinco minutos y una tarde.
Esta guía cubre cuál es el formato serializado, cómo decodificarlo con el insegurizar herramienta en Toolz.dev y, lo que es más importante, la única limitación real que necesita conocer antes de confiar en el resultado en datos que no están en inglés.
TL;Dr: feb
serialize()empaqueta valores en una cadena tipográfica comoa:2:{s:4:"name";s:5:"Alice";...}donde cada pieza lleva su tipo y longitud. los Herramienta desvializar Analiza eso en tu navegador y lo muestra como un árbol,print_r,var_dump, o JSON: sin servidor PHP, sin carga de datos. Gran advertencia que verifiqué: cuenta la longitud de la cadena en unidades de código UTF-16, no en bytes, por lo que los datos serializados que contienen acentos, emoji o caracteres CJK pueden analizarse mal o fallar. Para datos ASCII es confiable. Lee datos; no resuelve referencias de objetos ni le permite editar en su lugar.
¿Qué es la serialización de PHP, realmente?
La serialización convierte un valor PHP (una matriz, un objeto, una cadena, un número entero, lo que sea) en una cadena plana que puede almacenar en una columna de base de datos o en un archivo y luego reconstruir con unserialize(). Dos funciones hacen el trabajo: serialize() Convierte un valor en la cadena y unserialize() lo convierte de nuevo.
Lo que hace que el formato sea legible una vez que sepa el código es que cada valor anuncia su tipo y tamaño. Aquí está todo el vocabulario:
s:5:"hello" // string: s:length:"value"
i:42 // integer: i:value
d:3.14 // double: d:value
b:1 // boolean true (b:0 is false)
N; // null
a:2:{...} // array: a:count:{key;value;...}
O:8:"ClassName":1:{...} // object: O:namelen:"Class":propcount:{...}
Entonces, una matriz asociativa serializada se ve así:
a:3:{s:4:"name";s:10:"John Smith";s:5:"email";s:16:"[email protected]";s:4:"role";s:5:"admin";}
que es solo esta matriz de PHP, empaquetada apretada:
array(
'name' => 'John Smith',
'email' => '[email protected]',
'role' => 'admin'
)
Compacto para la máquina, cerca de ilegible para un ser humano a las 2 pm en una llamada de soporte. Ese es todo el problema que la herramienta resuelve.
¿Cómo la decodifica la herramienta Toolz.dev Unserialize?
Pega la cadena y analiza el formato directamente en JavaScript en su navegador y renderiza el resultado. Probé cada uno de estos contra el propio analizador de la herramienta mientras escribía esto, por lo que el siguiente comportamiento es lo que realmente hace, no lo que asume un manual.
Las matrices secuenciales con clave entera vuelven como una lista real. a:2:{i:0;s:5:"apple";i:1;s:6:"banana";} decodifica a ["apple", "banana"]. Las matrices asociativas vuelven como objetos con clave. Las estructuras anidadas anidan correctamente, las matrices dentro de las matrices dentro de los objetos, hasta el final.
Los objetos mantienen su nombre de clase. O:4:"User":2:{s:4:"name";s:3:"Bob";...} decodifica con un __class__ marcador de "User" además de sus propiedades, para que puedas ver tanto el tipo como los datos. Incluso maneja el incómodo caso de propiedades privadas y protegidas, que PHP serializa con prefijos de bytes nulos alrededor del nombre de la clase; la herramienta los elimina y le muestra el nombre de propiedad limpia.
Obtiene ocho formatos de salida para cambiar entre: vista de árbol, print_r, var_dump, var_export, krumo, firephp, dbug y llano json. Vivo en Tree View para explorar y JSON para copiar en otra cosa, pero si su memoria muscular espera var_dump Salida, está justo ahí.
La única limitación que necesitas saber: cadenas de varios bytes
Esta es la parte que me gustaría que alguien me dijera antes de confiar en un decodificador en datos de producción, así que aquí está al frente.
El formato serializado de PHP mide la longitud de la cadena en bytes. La herramienta lo mide en Longitud de la cadena de Java, que cuenta las unidades de código UTF-16. Para ASCII simple, esos son el mismo número, por lo que los datos en inglés se decodifican perfectamente. En el momento en que una cadena contiene un carácter UTF-8 de varios bytes, divergen.
Tome la palabra "café." en UTF-8 el "é" es de dos bytes, por lo que PHP lo serializa como s:5:"café" - longitud cinco, contando bytes. La herramienta lee eso 5 y agarra cinco Unidades de código de la cuerda, que es café" - se traga la cita final y pierde su lugar. Ejecuté exactamente esto: un independiente s:5:"café"; Decodifica al valor incorrecto, y dentro de una matriz como a:2:{s:1:"a";s:5:"café";s:1:"b";i:1;} falla directamente con Unknown type ':' at position 25.
La conclusión práctica: si está depurando opciones de WordPress que son ASCII puro (la mayoría de las configuraciones de complementos, slugs, indicadores booleanos), está bien. Si los datos serializados contienen nombres acentuados, emoji o texto CJK, la decodificación puede corromperse o generar errores, y eso es un error real en la herramienta, no en sus datos. (Para el registro, la solución de nuestro extremo es analizar la longitud de los bytes UTF-8 en lugar de .length; está en mi lista.) Cuando lo presiona, los comandos de serialización de WP-CLI en el servidor son los respaldos confiables.
Hay una advertencia relacionada y más suave: el var_dump La salida informa de longitudes de cadenas usando el mismo recuento de unidades de código, por lo que var_dump("café") espectáculos string(4) Donde diría PHP real string(5), y un emoji muestra una longitud que tampoco coincidirá con el recuento de bytes de PHP. Lea esos números como "longitud de JavaScript", no "longitud de bytes de php".
¿Por qué necesitaría desvializar datos fuera de PHP?
Muchas razones, y casi ninguna de ellas es "por diversión".
La depuración es la más grande. Un informe de error dice que la configuración del usuario es incorrecta; la configuración es un blob serializado en la base de datos; no puede ver el problema hasta que lo decodifique. El flujo de trabajo que uso es: SELECT option_value FROM wp_options WHERE option_name = 'widget_text';, copiar el resultado, pegarlo en el Herramienta desvializar, y lee el árbol. Diez segundos en lugar de escribir un script PHP desechable.
Las migraciones son furtivas. Las cadenas serializadas incrustan sus propias longitudes, por lo que un ingenuo buscar y reemplazar en un volcado de base de datos (por ejemplo, intercambiar un dominio antiguo por uno nuevo) cambia el contenido de la cadena sin actualizar el prefijo de longitud, y cada valor afectado deja de serializable. La decodificación primero le muestra exactamente qué valores transportan el dominio para saber qué se romperá una simple búsqueda y reemplazo. (La herramienta correcta para el reemplazo en sí es WP-CLI's search-replace, que entiende la serialización.)
Luego está la inspección de caché y sesión (Redis, Memcached y cachés de archivos en aplicaciones PHP a menudo contienen valores serializados) y la revisión de seguridad, donde debe ver qué se almacena realmente antes de poder juzgar si es seguro.
¿Es seguro decodificar datos serializados en el navegador?
Más seguro que hacerlo en PHP, y vale la pena entender por qué.
PHP Nativo unserialize() Tiene un largo historial de seguridad. Alimentado con una cadena elaborada, puede crear una instancia de objetos arbitrarios y activar sus métodos mágicos (__wakeup, __destruct), que bajo las condiciones adecuadas se convierte en un ataque de inyección de objeto y, en el peor, ejecución de código remoto. Por eso el consejo permanente es nunca llamar unserialize() en la entrada no confiable, y pasar ['allowed_classes' => false] cuando debes.
La herramienta del navegador elude todo eso porque nunca racistas PHP. Lee el formato de cadena y muestra la estructura: no se crean objetos PHP, no se activan métodos mágicos y no hay un intérprete que explotar. Los datos también permanecen en su dispositivo; se analiza localmente y nunca se envía a un servidor, lo cual importa cuando el blob serializado es una sesión o algo más que preferirías no cargar. Entonces para inspeccionando Datos serializados no confiables, el navegador es realmente el lugar más seguro.
PHP nativo unserialize() |
Herramienta de navegador Toolz.dev | |
|---|---|---|
| instancias de objetos | Sí (riesgo de inyección) | No, solo lee estructura |
| se ejecuta en un servidor | sí | No, local en el navegador |
| Seguro en la entrada no confiable | solo con allowed_classes |
Sí, nunca se ejecuta |
| Maneja longitudes de varios bytes | correctamente (bytes) | No confiable (unidades de código) |
| Resuelve las referencias de objetos | sí | No - muestra [Reference] |
| proponerse | Reconstruir valores en vivo | Inspeccionar y leer |
Esa tabla también es un resumen honesto de la compensación: la herramienta del navegador es el lector seguro, no un reemplazo de la función de idioma.
¿Cuáles son las fuentes comunes del mundo real?
Si estás aquí, probablemente sea uno de estos. WordPress se apoya en gran medida en la serialización en wp_options - widget_text, sidebars_widgets, theme_mods_*, la lista de complementos activos, cronor horarios. WooCommerce almacena las variaciones, los atributos y los campos personalizados como Meta de publicación serializada, por lo que un producto con precios incorrectos a menudo se remonta a un valor serializado. Laravel utiliza la serialización para el almacenamiento de caché de archivos y el almacenamiento de sesión. El sistema de configuración de Magento está lleno de él. Mismo formato en todas partes; mismo enfoque de decodificación.
Un par de cosas que la herramienta no hace
Dos límites honestos. No resuelve referencias: PHP puede serializar un puntero a un valor anterior (r: investigaciones operacionales R:), y la herramienta muestra las que son como un literal [Reference] marcador en lugar de seguirlos. Y es un lector, no un editor: no hay " cambie este valor y vuelva a serializar" modo. Para modificar datos serializados, decodificarlos, realizar su cambio en PHP o JSON y volver a serializarlos en el lado PHP. Si debe editar manualmente la cadena sin formato, recuerde que también debe corregir los prefijos de longitud y, según la sección anterior, contar bytes, no caracteres.
Preguntas frecuentes
¿Para qué se utiliza la serialización de PHP?
Convierte valores complejos como matrices y objetos en una sola cadena que puede vivir en una columna de base de datos, un archivo o una caché, y luego volver a construirla. WordPress, WooCommerce, Laravel y Magento lo usan mucho para configuraciones, datos de sesión y valores en caché.
¿Puedo desviar la serie de datos PHP sin un servidor PHP?
Sí. los Herramienta desvializar Analiza PHP serializado en JavaScript en su navegador. Sin instalación de PHP, sin servidor, sin cuenta.
¿Es seguro decodificar datos serializados en el navegador?
Sí, y es más seguro que el propio PHP unserialize() En la entrada no confiable, porque la herramienta solo lee la estructura de cadena. Nunca instancia los objetos PHP, por lo que el método mágico ataca que hacen nativos unserialize() peligroso simplemente no puede suceder.
¿Por qué mi cadena serializada no se decodifica?
Las causas habituales son una copia truncada (te perdiste los brackets finales o el primer carácter), un prefijo de longitud rota después de encontrar y reemplazar, o datos que en realidad no están seriados en PHP. Uno más que atrapa a las personas: si la cadena contiene caracteres acentuados, emoji o texto CJK, el conteo de longitud de la unidad de código de la herramienta puede analizarlo mal, porque PHP cuenta la longitud de la cadena en bytes y la herramienta cuenta unidades UTF-16.
¿Puedo decodificar valores de WordPress WP_OPTIONS con él?
Sí, ese es uno de los usos más comunes. Consulta el option_value, pégalo y lee la estructura. Solo tenga en cuenta que si la opción contiene texto de varios bytes, es posible que necesite WP-CLI en el servidor.
¿Puedo editar datos serializados con esta herramienta?
No, es un lector. Para cambiar un valor, decodifique, edite en PHP o JSON y vuelva a serializar en el lado de PHP. Editar a mano la cadena sin procesar significa fijar los prefijos de longitud de byte, lo que es propenso a errores.
¿Cuál es la diferencia entre la serialización de PHP y JSON?
La serialización conserva tipos específicos de PHP, incluidos los nombres de clase de objeto y las propiedades privadas. JSON es anóstico al lenguaje y solo conoce cadenas, números, booleanos, nulos, matrices y objetos. El nuevo código generalmente prefiere JSON porque json_decode() No instanciar objetos, por lo que evita el riesgo de inyección y JSON se puede leer en todas partes. Puede mover una estructura decodificada a la Formateador JSON para trabajar con él de esa manera.
¿La herramienta maneja objetos serializados, no solo matrices?
Sí. Los objetos se decodifican con su nombre de clase conservado junto con las propiedades y las propiedades privadas o protegidas (que PHP se serializa con prefijos de bytes nulos) se limpian con nombres legibles en la salida.
idea de narración
Los datos de PHP serializados son inevitables si toca WordPress, WooCommerce o Laravel, y poder leerlos a pedido convierte una categoría de errores frustrantes en rápidos. los Herramienta desvializar lo hace en una pestaña del navegador, de forma segura, sin un servidor PHP, siempre y cuando sepas que es un borde real: las cadenas de varios bytes pueden disparar el conteo de longitud y los datos ASCII están donde brillan. Pegar, leer, arreglar. Y cuando los datos estén llenos de acentos o emoji, busque WP-CLI.
Herramientas relacionadas:



