piapia123
es

Serializar / deserializar PHP

Cifrado

Todo se ejecuta en tu navegador: no se sube nada

Entrada
Arrastra un archivo aquí para cargarlo
Resultado

Tres direcciones: deserializar (convertir `a:2:{s:4:"name";s:3:"Bob";}` en JSON, o en un literal de array de PHP que puedes pegar en tu código), serializar (convertir JSON en una cadena que PHP pueda `unserialize()`) y datos de sesión (un archivo de sesión de PHP no es un valor serializado, sino pares `nombre|valor` concatenados, así que necesita su propio lector). La trampa es que la longitud de las cadenas cuenta bytes, no caracteres: `s:2:"é"` es correcto, porque esa letra acentuada ocupa dos bytes en UTF-8 aunque sea un solo carácter; un lector que cuenta caracteres funciona perfecto con ASCII y luego parte una cadena multibyte por la mitad, informando de un error que no apunta a ninguna causa cercana. Este lector avanza por puntos de código y cuenta bytes, así que incluso los emoji (dos unidades UTF-16 cada uno) quedan alineados.

Funciones

  • Tres direcciones: deserializar, serializar y analizar datos de sesión
  • La salida de deserializar puede ser JSON o un literal de array de PHP (pegable en código)
  • La longitud de las cadenas se lee en bytes, así que el texto no latino y los emoji no se desalinean
  • Los arrays de PHP pasan a array u objeto JSON según si las claves van desde 0, igual que json_encode()
  • Se restauran las propiedades de los objetos sin dejar que el nombre de la clase se cuele en el JSON, donde no tiene sitio
  • Los datos de sesión se parten por la barra; un valor ilegible cae a cadena en vez de tumbar todo el archivo
  • Un archivo de sesión cortado en el último punto y coma aún se lee
  • La dirección de serializar también mide en bytes, así que los datos no latinos vuelven por unserialize() de PHP
  • Se toleran espacios finales y puntos y comas sueltos, habituales en valores sacados de una base de datos o un log
  • Al pasar de 64 niveles de anidamiento se detiene, en lugar de reventar la pila de llamadas
  • Todo se ejecuta localmente en el navegador; tus datos no se suben

Cómo se usa

  1. Elige una dirección
  2. Pega la cadena serializada, el JSON o el contenido del archivo de sesión
  3. Al deserializar, elige la salida: JSON para trabajar o un literal de array de PHP para pegar en código

Preguntas frecuentes

¿Por qué la longitud de las cadenas va en bytes y no en caracteres?
Porque es lo que fija el formato de PHP: el número tras `s:` cuenta bytes. `s:2:"é"` es correcto, ya que esa letra ocupa dos bytes pero es un solo carácter; si escribes `s:1:"é"`, el propio unserialize() de PHP también falla. Muchos conversores en línea cuentan caracteres, lo que va bien con ASCII puro y falla en cuanto aparece texto multibyte, con la posición del error lejos de la causa, por lo que suele diagnosticarse mal como datos corruptos.
¿Por qué un array de PHP a veces es un array JSON y a veces un objeto?
Porque PHP tiene un único tipo de array que sirve de lista y de diccionario, mientras que JSON lo divide en dos. La regla aquí es: las claves que van 0, 1, 2… dan un array JSON, cualquier otra cosa da un objeto — justo lo que hace el propio json_encode() de PHP, así que deserializar y volver a codificar da el mismo resultado que esta herramienta. Claves como 1,2,3 o cualquier clave de texto producen un objeto, y las claves numéricas se escriben como texto, como exige JSON.
¿Dónde ha ido a parar el nombre de la clase del objeto?
No aparece en el JSON, porque JSON no tiene dónde ponerlo: inventar una clave como `__class` fabricaría datos e induciría al código posterior a tratar como real un campo que nunca existió. Las propiedades sí se conservan enteras; si necesitas el nombre de la clase, usa la salida PHP o mira el valor original. Ojo también: los tipos de referencia (`R:` y `r:`) no se admiten a propósito, porque significan «esta entrada es la misma memoria que una anterior», y expandirlos en dos copias independientes parece correcto pero cambia el significado; por eso aquí se informa de un error.
¿Es seguro pegar los datos deserializados otra vez en el unserialize() de PHP?
Depende de de dónde vengan. El unserialize() de PHP ejecuta `__wakeup()` y `__destruct()` al restaurar un objeto, y así es como un atacante puede entregarte una carga útil que ejecute código: la clásica inyección de objetos de PHP. Esta herramienta solo convierte texto en JSON y no ejecuta nada, pero si llevas datos serializados de origen desconocido a tu propio código PHP, el riesgo está en ese paso. Las entradas de caché y los mensajes de tu propia cola están bien; para cualquier cosa enviada por un usuario o reenviada por alguien, piensa antes en el origen.
¿Por qué se admiten los datos de sesión?
Porque un archivo de sesión de PHP no es un valor serializado, sino entradas `nombre|valor` concatenadas, así que necesita su propio lector. Aquí se lee el manejador `php` por defecto. Si tu proyecto usa `php_binary` o `php_serialize`, la forma cambia, y los valores que no se pueden leer se conservan como texto en vez de tumbar el archivo, para que al menos veas qué claves hay.
¿Se suben mis datos?
No. El análisis y la generación ocurren enteramente en la memoria del navegador; la página no hace ninguna petición y funciona sin conexión. Los datos serializados a menudo llevan información de usuario y contenido de sesión, y nada de eso sale de tu equipo.

Herramientas relacionadas