
PHP unserialize : décoder options WordPress et données sérialisées
Désérialisez `wp_postmeta`, sessions PHP et caches Laravel en JSON lisible dans le navigateur — tableaux et scalaires uniquement, sans script local.
Décoder le PHP sérialisé plutôt que lire des jetons bruts
Une option_value WordPress, un wp_postmeta.meta_value, un blob de session PHP ou un dump de cache Laravel arrive souvent dans l’éditeur sous la forme a:3:{s:8:"blogname";…}. Cette chaîne est la sortie de serialize() en PHP. Ce n’est ni du JSON ni un bundle minifié. Le désérialiseur PHP en ligne transforme les jetons de tableaux et de scalaires en JSON lisible (ou en syntaxe de tableau PHP), dans le navigateur. Il n’exécute pas PHP, n’instancie pas d’objets de classe et n’envoie pas la charge utile. Cet article décrit la démarche de débogage : où se trouvent ces blobs, comment les coller sans risque et quand le PHP natif reste nécessaire. Pour le format de sérialisation, la comparaison avec JSON et l’injection d’objets, commencez par le guide de sérialisation PHP. Les ressources front du même site WordPress relèvent d’un autre chantier, traité dans la minification WordPress.
Serialize et unserialize, deux outils pour un même dump WordPress
PHP serialize() émet une chaîne typée. unserialize() reconstruit la valeur. FastMinify reprend cette scission : php-serialize encode du JSON ou une syntaxe tableau PHP en jetons a:/s:/i: ; php-unserialize les décode. Ne collez pas un blob sérialisé dans le sérialiseur, ni du JSON dans le désérialiseur. Les utilitaires voisins sont sur le hub utilitaires développeur.
a:…, s:…, i:…, d:…, b:…, N;array(…) / => (voir PHP serialize en ligne)Le cœur de WordPress et beaucoup de plugins appellent maybe_serialize() / maybe_unserialize(). Si la valeur est un tableau PHP (ou un objet), elle est stockée dans MySQL sous forme de chaîne serialize(). Les scalaires (chaînes, nombres) restent tels quels : toutes les lignes ne commencent donc pas par a:.
wp_options.option_value : nom du site, permaliens, instances de widgets, réglages des pluginswp_postmeta.meta_value : tailles des pièces jointes, champs personnalisés, constructeurs de pageswp_usermeta / wp_commentmeta : même schéma, par utilisateur ou par commentaire_transient_*) contiennent souvent un tableau, et la date d’expiration se trouve dans une option distincteO: suivi d’un nom de classe, FastMinify la refuse : c’est un objet de plugin, pas un tableauEn PHP, unserialize() sur une entrée non fiable peut instancier des objets et déclencher des chaînes de gadgets (injection d’objets). FastMinify analyse le format en JavaScript. L’outil n’exécute jamais de PHP et ne décode ni les objets de classe O: ni les références R:. C’est à la fois une limite et une garantie de sécurité. Servez-vous-en pour inspecter des dumps de tableaux. Un décodage réussi ne prouve pas que ce payload puisse être passé sans risque à unserialize en production.
unserialize($s, ['allowed_classes' => false]) (PHP 7+)eval ni wp-cli eval sur un blob copié d’un ticketCe que l’analyseur accepte et à quoi ressemble une ligne WordPress
Chaque jeton commence par une lettre. Le désérialiseur de FastMinify accepte le même sous-ensemble que celui qu’il sait sérialiser : null, bool, int, float, chaîne, tableau imbriqué. Les objets et les références provoquent une erreur au lieu d’être ignorés en silence.
Avant
Après
a:N:{…} : tableau de N paires clé/valeur (associatif ou indexé)s:n:"…" est une chaîne, où n est la longueur en octets et non le nombre de caractères UTF-8i: entier, d: flottant, b:0/b:1 bool, N; nullO:8:"stdClass" et R: / r: ne sont pas décodés icis:3:"hello", sans point-virgule final, échoue au lieu de corrompre le reste du tableau. L’outil ne compare pas le nombre à la longueur du texte : vérifiez-le en PHP quand cela compteLes métadonnées de pièces jointes et certains champs personnalisés sont des tableaux d’entiers et de chaînes, par exemple les champs relation ou cases à cocher d’ACF. C’est exactement le sous-ensemble que gère l’analyseur. Collez la cellule, cliquez sur Désérialiser et copiez le JSON.
Avant
Après
wp option get … --format=json désérialise déjà en PHP : FastMinify sert quand vous n’avez que le dump SQLLes fichiers de session PHP et certains pilotes de cache Laravel stockent des payloads serialize(). Si la valeur est un tableau de scalaires, l’outil fonctionne dans le navigateur. Pour un modèle Eloquent, une instance Carbon ou toute classe O:, FastMinify renvoie une erreur explicite. C’est voulu : l’outil ne prétend pas remplacer unserialize de PHP.
Cache::put Laravel d’un tableau simple donne en général a: : collez et décodezO: : décodez-les en PHP avec une allowlist, pas iciencrypt() ne sont pas du serialize() : déchiffrez-les d’abord dans l’applicationO:, pas de R:, pas d’exécution d’objetDésérialiser dans le navigateur, avec un exemple concret sur WordPress
Ouvrez le désérialiseur PHP, collez une seule chaîne sérialisée et cliquez sur Désérialiser. La sortie est du JSON par défaut (indentation de 2 espaces). Passez à la syntaxe de tableau PHP si vous recollez le résultat dans un extrait de code. Tout reste dans l’onglet, sans compte et sans aller-retour avec un serveur.
Un widget de barre latérale s’affiche vide après une migration. L’option widget_* est un tableau sérialisé. Il faut voir quelles clés ont survécu, pas deviner depuis une cellule de 400 caractères.
1. Copier la valeur brute de la colonne option_value
Depuis SQL ou WP-CLI, copiez la chaîne complète à partir de a:. Un aperçu tronqué par … ne sera pas analysé.
2. Coller dans php-unserialize
Ouvrez php-unserialize et laissez la sortie sur JSON. Si une erreur de format inconnu apparaît sur O:, le widget a stocké un objet : arrêtez-vous là et passez par PHP avec allowed_classes.
3. Modifier le JSON, puis sérialiser à nouveau seulement si vous devez réécrire la valeur
Corrigez les clés dans le JSON, puis refaites l’encodage avec php-serialize. Cet aller-retour vaut pour les tableaux et scalaires que cet analyseur gère. Il ne redonne pas une chaîne identique octet pour octet à celle de WordPress (ordre des clés, espaces). Préférez WP-CLI wp option update avec du JSON quand c’est possible.
Redis affiche une valeur qui commence par a:. Vous voulez savoir quelles clés de configuration figurent dans le payload avant de supprimer la clé.
1. Copier la valeur en texte brut
redis-cli échappe les guillemets d’une valeur, sauf en mode brut : copiez donc la valeur en texte brut. Si quelque chose précède le premier a: ou s: (le pilote de cache fichier de Laravel écrit d’abord une date d’expiration), supprimez-le.
2. Décoder en local
Collez la valeur dans le désérialiseur. Les tableaux imbriqués deviennent des objets ou des tableaux JSON. Les nulls sont conservés si l’option « Inclure les valeurs null » est activée (réglage par défaut).
3. Laisser à PHP les payloads d’objets
Un jeton de classe Illuminate\… produira une erreur. L’outil se comporte comme documenté : le dump Redis n’est pas cassé.
Quand il faut encore PHP (et comment faire l’aller-retour tableaux)
Si le blob contient des objets, ou si vous travaillez dans un script de déploiement, décodez en PHP sans instancier de classes. Les objets de classe incomplète donnent le nom de la classe sans exécuter les constructeurs. FastMinify ne remplace pas cette protection.
Exemple de base
Le cœur de WordPress connaît déjà le format. maybe_unserialize() renvoie des tableaux, et WP-CLI affiche du JSON, donc vous n’éditez jamais les préfixes de longueur à la main. Utilisez FastMinify quand vous n’avez qu’un export SQL ou un texte collé depuis un ticket. Réécrivez ensuite par les API de WordPress, pas par une requête UPDATE brute sur une chaîne serialize() modifiée à la main.
Exemple de base
Décodez avec php-unserialize, modifiez le JSON, puis encodez avec php-serialize. Les objets JSON imbriqués deviennent des tableaux PHP, pas des objets O:. Trier les clés ou retirer les nulls et les structures vides change ce que vous réécrivez. La documentation de l’outil le dit clairement : ce n’est pas un utilitaire de migration SQL WordPress fidèle à l’octet près. Pour le CSS et le JS du même site, reportez-vous au guide minification WordPress, qui suit une autre chaîne de traitement.
Exemple de base
Conclusion
Collez la chaîne serialize(), lisez le JSON, puis décidez si le payload est un tableau que vous pouvez reconvertir ou un objet qui relève de PHP. FastMinify fait cette inspection en local et refuse O:/R:. Ce n’est ni unserialize(), ni WP-CLI, ni un chercher-remplacer sûr sur un dump MySQL. Pour le détail du format, gardez le guide de sérialisation PHP à portée de main.
Décoder un blob WordPress ou de session maintenant
Articles connexes

HTTP/2 et HTTP/3 changent le trajet des fichiers, pas leur poids. Mesures de taille, de compilation et de bundling : ce que la minification apporte encore.

Convertissez un epoch Unix en date lisible et inversement, distinguez secondes et millisecondes, et évitez les pièges de fuseau, de JWT et de changement d’heure.

Lisez une expression cron champ par champ, voyez ses prochaines exécutions en UTC ou en heure locale et évitez les pièges de pas, de fuseau et de dialecte.