Serializar / deserializar PHP
CifradoTodo se ejecuta en tu navegador: no se sube nada
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
- Elige una dirección
- Pega la cadena serializada, el JSON o el contenido del archivo de sesión
- 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
Base64
CifradoConvierte texto a Base64 y al revés, con UTF-8 correcto para acentos, chino y emoji. Todo se ejecuta en tu navegador: no se sube nada.
Formateador JSON
FormatoFormatea, valida y repara JSON en línea: árbol plegable, búsqueda de claves y valores, edición nodo a nodo y errores con línea y columna.
Codificar URL
CifradoEscapa texto a la forma %XX y lo devuelve, tratando una URL completa y un valor de parámetro como trabajos distintos. Todo en tu navegador.
Desempaquetador JS
CifradoDesempaqueta código comprimido con eval(function(p,a,c,k,e,d){…}) o vuelve a empaquetarlo. Manipulación de cadenas: no se ejecuta ningún script.
Entidades HTML
CifradoConvierte < > & y las comillas en entidades HTML y las devuelve en una sola pasada, así que &lt; da <, no un ángulo. En tu navegador.
JWT (decodificar y verificar)
CifradoDivide un JWT en cabecera, payload y firma, verifica firmas HS256/384/512 con tu secreto y traduce exp y nbf a fechas. Todo en tu navegador.