PHP unserialize : décoder options WordPress et données sérialisées

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.

31.08.2026
10 min de lecture
Partager cet article:
PHPDésérialisationWordPressDébogageSérialisationTutoriel

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.

Inspecter wp_options, postmeta et transients sans script PHP local
Sortie JSON ou tableau PHP, indentation de 2 espaces par défaut, et rien ne quitte l’onglet
Tableaux et scalaires uniquement : les objets de type O et les références de type R sont rejetés
Plus sûr que unserialize() PHP sur un dump inconnu : aucune exécution d’objet
Aller-retour des tableaux via php-serialize, une fois le JSON lisible modifié

Serialize et unserialize, deux outils pour un même dump WordPress

serialize() écrit et unserialize() lit, d’où deux pages distinctes dans FastMinify

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.

Page unserialize : coller a:…, s:…, i:…, d:…, b:…, N;
Page serialize : collez du JSON ou la syntaxe array(…) / => (voir PHP serialize en ligne)
Format de sortie unserialize : JSON (défaut) ou syntaxe tableau PHP
Le JSON indenté sert à lire ; le JSON compact passe par le minificateur JSON en ligne après copie
Un fichier JS minifié d’un plugin n’est pas du serialize() : utilisez un déminificateur JavaScript en ligne
Où WordPress stocke vraiment serialize()

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 plugins
wp_postmeta.meta_value : tailles des pièces jointes, champs personnalisés, constructeurs de pages
wp_usermeta / wp_commentmeta : même schéma, par utilisateur ou par commentaire
Les transients (options _transient_*) contiennent souvent un tableau, et la date d’expiration se trouve dans une option distincte
Si la cellule commence par O: suivi d’un nom de classe, FastMinify la refuse : c’est un objet de plugin, pas un tableau
unserialize() PHP est une frontière de sécurité, l’outil du navigateur n’est pas du PHP

En 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.

Dump inconnu : inspectez-le d’abord dans le navigateur, sans envoi ni processus PHP
Si vous devez décoder en PHP : unserialize($s, ['allowed_classes' => false]) (PHP 7+)
Ne lancez jamais eval ni wp-cli eval sur un blob copié d’un ticket
Les dumps d’options peuvent contenir des clés d’API : un onglet local est plus sûr qu’un désérialiseur en ligne qui envoie les données à un serveur

Ce que l’analyseur accepte et à quoi ressemble une ligne WordPress

Préfixes de type dans une option_value typique

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

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

Après

{ "blogname": "FastMinify", "description": "Local developer tools.", "WPLANG": "en_US" }
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-8
i: entier, d: flottant, b:0/b:1 bool, N; null
O:8:"stdClass" et R: / r: ne sont pas décodés ici
Une chaîne tronquée comme s: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 compte
Lire un tableau imbriqué de wp_postmeta

Les 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

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

Après

{ "width": 1200, "height": 630 }
phpMyAdmin / TablePlus : copier la cellule brute, pas l’aperçu tronqué
WP-CLI wp option get … --format=json désérialise déjà en PHP : FastMinify sert quand vous n’avez que le dump SQL
Après le décodage, la barre d’outils propose JSON (réglage par défaut) ou la syntaxe de tableau PHP, ainsi que la taille d’indentation et les espaces ou tabulations
Les filtres facultatifs (retirer les nulls, les tableaux vides et les objets vides, ou trier les clés) modifient le payload : laissez-les désactivés pour une inspection fidèle
JSON compact pour un ticket : minificateur JSON en ligne sur la sortie copiée
Sessions, caches Laravel et la limite des objets

Les 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.

Un Cache::put Laravel d’un tableau simple donne en général a: : collez et décodez
Les modèles Eloquent de Laravel et les DTO maison donnent O: : décodez-les en PHP avec une allowlist, pas ici
Les cookies chiffrés et les payloads encrypt() ne sont pas du serialize() : déchiffrez-les d’abord dans l’application
Les caches en igbinary ou en JSON ne sont pas du serialize() PHP : vérifiez le pilote avant de coller
Même honnêteté que la doc outil : pas de O:, pas de R:, pas d’exécution d’objet

Désérialiser dans le navigateur, avec un exemple concret sur WordPress

Utiliser le désérialiseur PHP

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.

Acceptés : null, booléens, entiers, flottants, chaînes et tableaux imbriqués
Rejetés : objets de classe de type O, références de types R et r, chaînes tronquées. Le nombre qui annonce la longueur n’est pas vérifié
Options : sortie en JSON ou en tableau PHP, inclusion des nulls (activée par défaut), suppression des tableaux et objets vides, tri des clés, taille d’indentation, espaces ou tabulations
Ce n’est pas un outil de migration SQL pour WordPress : ne modifiez pas à la main les longueurs de chaînes dans un dump
Une instance de widget dans wp_options

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

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

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

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.

Un dump de cache Laravel dans Redis

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

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

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

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)

allowed_classes réglé sur false, la vérification côté PHP

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

<?php // Inspecter un dump serialize() non fiable sans instancier de classes (PHP 7+). $raw = file_get_contents('option_value.txt'); $value = unserialize($raw, ['allowed_classes' => false]); var_export($value);
maybe_unserialize et WP-CLI dans WordPress

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

# Lire une option en JSON (WordPress désérialise en PHP). wp option get widget_text --format=json # Mettre à jour depuis un fichier JSON plutôt que de patcher s:n:\"…\" dans SQL. wp option update my_plugin_settings "$(cat settings.json)" --format=json
Aller-retour dans le navigateur, tableaux uniquement

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

// Boucle navigateur (tableaux/scalaires uniquement) : // 1. Coller la chaîne serialize() → php-unserialize → JSON // 2. Éditer le JSON // 3. Coller le JSON → php-serialize → nouvelle chaîne a:… // Ne pas UPDATE wp_options avec un préfixe s:n:"…" édité à la main.

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.

Copier la cellule entière, car une chaîne tronquée ne s’analyse pas
Laisser les payloads O: à PHP avec allowed_classes réglé sur false
Ne pas modifier à la main les longueurs de chaînes dans SQL
Aller-retour tableaux uniquement : unserialize → JSON → serialize
Garder les dumps dans le navigateur ; option_value peut contenir des secrets
Partager cet article
Partager cet article: