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:
PHP
Désérialisation
WordPress
Débogage
Sérialisation
Tutoriel

Pourquoi décoder du PHP sérialisé plutôt que lire a:3:{…} ?

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 le serialize() de PHP — pas du JSON, pas un bundle minifié. Le désérialiseur PHP en ligne transforme les jetons tableaux et scalaires en JSON lisible (ou en syntaxe 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 est le workflow de débogage : où vivent ces blobs, comment les coller sans risque, et quand il faut encore du PHP natif. Pour le format filaire, JSON vs serialize, et l’injection d’objets, commencez par le guide de sérialisation PHP. Les assets front du même site WordPress sont un autre chantier — voir la minification WordPress.

Inspecter wp_options, postmeta et transients sans script PHP local
Sortie JSON ou tableau PHP, indent 2 espaces par défaut — rien ne quitte l’onglet
Parseur honnête : tableaux et scalaires uniquement — objets O: et références R: rejetés
Plus sûr que unserialize() PHP sur un dump inconnu : aucune exécution d’objet
Aller-retour tableaux via php-serialize après édition du JSON lisible

Serialize vs unserialize : deux outils, un dump WordPress

serialize() écrit ; unserialize() lit — FastMinify sépare les pages

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 : coller du JSON ou 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 et beaucoup de plugins appellent maybe_serialize() / maybe_unserialize(). Si la valeur est un tableau PHP (ou un objet), elle est stockée comme chaîne serialize() dans MySQL. Les scalaires (chaînes, nombres) restent tels quels — vous ne verrez pas de préfixe a: sur chaque ligne.

wp_options.option_value — nom du site, permaliens, instances de widgets, réglages de plugins
wp_postmeta.meta_value — tailles de pièces jointes, champs personnalisés, constructeurs de pages
wp_usermeta / wp_commentmeta — même schéma, par utilisateur ou commentaire
Transients (_transient_*) encapsulent souvent un tableau avec un timeout
Si la cellule commence par O: plus un nom de classe, FastMinify la refuse — c’est un objet plugin, pas un tableau
unserialize() PHP est une frontière de sécurité ; l’outil navigateur n’est pas PHP

En PHP, unserialize() sur une entrée non fiable peut instancier des objets et déclencher des chaînes gadgets (injection d’objets). FastMinify parse le format en JavaScript. Il n’exécute jamais PHP, et ne décode pas les objets de classe O: ni les références R:. C’est une limite et une propriété de sûreté. Servez-vous-en pour inspecter des dumps tableaux. Un décodage réussi ne veut pas dire « ce payload est sûr à unserialize en production ».

Dump inconnu : inspecter d’abord dans le navigateur — pas d’upload, pas de process PHP
Si vous devez décoder en PHP : unserialize($s, ['allowed_classes' => false]) (PHP 7+)
Jamais d’eval ni de wp-cli eval sur un blob copié d’un ticket
Les dumps d’options peuvent contenir des clés API — un onglet local vaut mieux qu’un désérialiseur en ligne qui poste sur un serveur

Ce que le parseur 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 FastMinify accepte le même sous-ensemble qu’il peut sérialiser : null, bool, int, float, chaîne, tableau imbriqué. Objets et références sont des erreurs, pas des sauts silencieux.

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:"…" — chaîne ; n est la longueur en octets, pas le nombre de caractères UTF-8
i: entier, d: flottant, b:0/b:1 bool, N; null
O:8:"stdClass" et R: / r:non décodés ici
Préfixes de longueur cassés (s:3:"hello") échouent au lieu de corrompre le reste du tableau
wp_postmeta : un tableau imbriqué qu’on peut vraiment lire

Les métadonnées de pièces jointes et beaucoup de champs type ACF sont des tableaux d’entiers et de chaînes — exactement le sous-ensemble géré. Collez la cellule, désérialisez, 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 décodage, barre d’outils : JSON (défaut) vs syntaxe tableau PHP ; indent 2 ; espaces ou tabulations
Filtres optionnels : retirer nulls, tableaux vides, objets vides, ou trier les clés — ils changent le payload, laissez-les off pour une inspecte fidèle
JSON compact pour un ticket : minificateur JSON en ligne sur la sortie copiée
Sessions, caches Laravel, et le mur O:

Les fichiers de session PHP et certains drivers de cache Laravel stockent des payloads serialize(). Si la valeur est un tableau de scalaires, l’outil navigateur fonctionne. S’il s’agit d’un modèle Eloquent, d’une instance Carbon, ou de n’importe quelle classe O:, FastMinify renvoie une erreur claire. C’est voulu — le produit ne prétend pas être l’unserialize de PHP.

Laravel Cache::put d’un tableau plat : en général a: — coller et décoder
Eloquent Laravel / DTO custom : O: — décoder en PHP avec une allow-list, pas ici
Cookies chiffrés et payloads encrypt() ne sont pas du serialize() — déchiffrer d’abord dans l’app
Stores igbinary ou JSON ne sont pas du serialize() PHP — regarder le driver 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 : une boucle WordPress concrète

Utiliser le désérialiseur PHP

Ouvrez le désérialiseur PHP, collez une seule chaîne sérialisée, cliquez Désérialiser. La sortie est du JSON par défaut (indent 2, espaces). Passez en syntaxe tableau PHP si vous recollez dans un snippet. Tout reste dans l’onglet — pas de compte, pas d’aller-retour serveur.

Jetons acceptés : N;, b:, i:, d:, s:, tableaux a: imbriqués
Rejetés : objets de classe O:, références R:/r:, préfixes de longueur tronqués ou invalides
Options : sortie JSON vs tableau PHP ; inclure les nulls (on par défaut) ; retirer tableaux/objets vides ; trier les clés ; taille d’indent et espaces vs tab
Pas un outil de migration SQL WordPress : ne faites pas de find-replace s:n:"…" à la main dans un dump
Scénario — 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

Étape 1 : copier l’option_value brute

Depuis SQL ou WP-CLI, copiez la chaîne complète qui commence à a:. Les aperçus tronqués avec échoueront au parse.

2

Étape 2 : coller dans php-unserialize

Ouvrez php-unserialize. Laissez la sortie sur JSON. Si vous voyez une erreur de format inconnu sur O:, le widget a stocké un objet — arrêtez-vous et utilisez PHP avec allowed_classes.

3

Étape 3 : éditer le JSON, puis re-sérialiser seulement si vous devez réécrire

Corrigez les clés dans le JSON. Réencodez avec php-serialize. Cet aller-retour concerne les tableaux/scalaires que ce parseur gère — il n’est pas octet-identique à la chaîne WordPress d’origine (ordre des clés, espaces). Préférez WP-CLI wp option update avec du JSON quand c’est possible.

Scénario — dump de cache Laravel dans Redis

Redis affiche une valeur qui commence par a:. Vous voulez savoir quelles clés de config sont dans le payload avant de flusher la clé.

1

Étape 1 : copier le payload sans le préfixe de longueur Redis

Si le driver enveloppe serialize() dans un préfixe Laravel, retirez le préfixe applicatif jusqu’au premier a: ou s:.

2

Étape 2 : décoder en local

Collez dans le désérialiseur. Les tableaux imbriqués deviennent des objets ou tableaux JSON. Les nulls restent si « inclure les valeurs null » est activé (défaut).

3

Étape 3 : laisser les payloads O: à PHP

Un jeton de classe Illuminate\… produira une erreur. C’est l’outil qui se comporte comme documenté — pas un dump Redis cassé.

Quand il faut encore PHP (et comment faire l’aller-retour tableaux)

allowed_classes => false — l’inspecte côté PHP

Si le blob contient des objets, ou si vous êtes dans un script de deploy, décodez en PHP sans instancier de classes. Les objets de classe incomplète donnent le nom de classe sans exécuter les constructeurs. FastMinify ne remplace pas cette barrière.

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);
WordPress : maybe_unserialize et WP-CLI

Le cœur connaît déjà le format. maybe_unserialize() renvoie des tableaux. WP-CLI affiche du JSON pour que vous n’éditiez jamais les préfixes de longueur à la main. Utilisez FastMinify quand vous n’avez qu’un export SQL ou un collage de ticket — puis réécrivez via les APIs WP, pas un UPDATE brut d’une chaîne serialize() bricolée.

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, éditez le JSON, encodez avec php-serialize. Les objets JSON imbriqués deviennent des tableaux PHP, pas des objets O:. Trier les clés ou retirer nulls/structures vides change ce que vous réécrivez. La doc on-page le dit clairement : ce n’est pas un utilitaire de migration SQL WordPress octet-accurate. Pour CSS/JS du même site, restez sur le guide minification WordPress — autre pipeline.

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, décidez si le payload est un tableau que vous pouvez faire aller-retour ou un objet qui appartient à PHP. FastMinify fait cette inspecte en local et refuse O:/R:. Ce n’est pas unserialize(), pas WP-CLI, et pas un find-replace sûr sur un dump MySQL. Pour le format en profondeur, gardez le guide de sérialisation PHP à côté de ce workflow.

Copier la cellule entière — une chaîne a: tronquée échoue au parse
Laisser les payloads O: à PHP avec allowed_classes => false
Ne pas éditer à la main les préfixes s:n:"…" 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: