PHP Unserialize: WordPress-Optionen und serialisierte Daten dekodieren

PHP Unserialize: WordPress-Optionen und serialisierte Daten dekodieren

`wp_postmeta`, PHP-Sessions und Laravel-Caches: per Unserialize zu lesbarem JSON — nur Arrays und Skalare, kein lokales Skript.

31.08.2026
10 Min. Lektüre
Teilen Sie diesen Artikel:
PHPUnserialisierenWordPressDebuggenSerialisierungAnleitung

Serialisiertes PHP dekodieren, statt rohe Tokens zu lesen

Ein WordPress-option_value, ein wp_postmeta.meta_value, ein PHP-Session-Blob oder ein Laravel-Cache-Dump landet oft als a:3:{s:8:"blogname";…} im Editor. Dieser String ist die Ausgabe von PHP serialize(). Er ist weder JSON noch ein minifiziertes Bundle. Der online PHP-Unserializer macht aus Array- und Skalar-Tokens lesbares JSON (oder PHP-Array-Syntax), direkt im Browser. Er führt kein PHP aus, erzeugt keine Klassenobjekte und lädt die Nutzlast nicht hoch. Dieser Artikel zeigt den Debug-Ablauf: wo diese Blobs liegen, wie Sie sie sicher einfügen und wann Sie noch natives PHP brauchen. Für das Serialisierungsformat, den Vergleich mit JSON und Object Injection beginnen Sie mit dem PHP-Serialisierungsleitfaden. Frontend-Dateien derselben WordPress-Seite sind ein eigenes Thema, das die WordPress-Minifizierung behandelt.

wp_options, Postmeta und Transients ohne lokales PHP-Skript prüfen
Ausgabe als JSON oder PHP-Array, standardmäßig mit 2 Leerzeichen eingerückt, nichts verlässt den Tab
Nur Arrays und Skalare: Objekte vom Typ O und Referenzen vom Typ R werden abgelehnt
Sicherer als PHP unserialize() auf einem unbekannten Dump: keine Objektausführung
Array-Roundtrip über php-serialize nach dem Bearbeiten des lesbaren JSON

Serialisieren und Unserialisieren, zwei Werkzeuge für einen WordPress-Dump

serialize() schreibt und unserialize() liest, deshalb hat FastMinify zwei getrennte Seiten

PHP serialize() erzeugt eine typisierte Zeichenkette, unserialize() stellt den Wert wieder her. FastMinify bildet diese Trennung nach: php-serialize kodiert JSON oder PHP-Array-Syntax in a:/s:/i:-Tokens, php-unserialize dekodiert sie. Fügen Sie keinen serialisierten Blob in den Serializer ein und kein JSON in den Unserializer. Weitere Hilfsprogramme finden Sie im Hub Entwickler-Utilities.

Unserialize-Seite: a:…, s:…, i:…, d:…, b:…, N; einfügen
Serialize-Seite: JSON oder array(…) / => einfügen (siehe PHP online serialisieren)
Ausgabeformat Unserialize: JSON (Standard) oder PHP-Array-Syntax
Eingerücktes JSON dient zum Lesen. Kompaktes JSON erzeugen Sie nach dem Kopieren mit dem online JSON-Minifizierer
Eine minifizierte JS-Datei eines Plugins ist kein serialize(): nutzen Sie einen online JavaScript-Unminifier
Wo WordPress serialize() wirklich speichert

Der Core und viele Plugins rufen maybe_serialize() / maybe_unserialize() auf. Ist der Wert ein PHP-Array (oder ein Objekt), speichert MySQL ihn als serialize()-String. Skalare (einfache Strings, Zahlen) bleiben unverändert, deshalb beginnt nicht jede Zeile mit a:.

wp_options.option_value: Sitename, Permalink-Struktur, Widget-Instanzen, Plugin-Einstellungen
wp_postmeta.meta_value: Anhangsgrößen, benutzerdefinierte Felder, Page Builder
wp_usermeta / wp_commentmeta: dasselbe Muster, je Benutzer oder Kommentar
Transients (_transient_*) enthalten oft ein Array, das Ablaufdatum steht in einer eigenen Option
Beginnt die Zelle mit O: und einem Klassennamen, lehnt FastMinify sie ab, denn das ist ein Plugin-Objekt und kein Array
PHP unserialize() ist eine Sicherheitsgrenze, das Browser-Tool ist kein PHP

In PHP kann unserialize() bei nicht vertrauenswürdigen Eingaben Objekte instanziieren und Gadget-Chains auslösen (Object Injection). FastMinify liest das Format in JavaScript. Es führt nie PHP aus und dekodiert weder O:-Klassenobjekte noch R:-Referenzen. Das ist eine Grenze und eine Sicherheitseigenschaft zugleich. Nutzen Sie das Tool, um Array-Dumps zu prüfen. Ein erfolgreiches Dekodieren bedeutet nicht, dass sich der Payload in Produktion bedenkenlos mit unserialize verarbeiten lässt.

Unbekannter Dump: zuerst im Browser prüfen, ohne Upload und ohne PHP-Prozess
Wenn Sie in PHP dekodieren müssen: unserialize($s, ['allowed_classes' => false]) (PHP 7+)
Wenden Sie nie eval oder wp-cli eval auf einen Blob aus einem Ticket an
Options-Dumps können API-Keys enthalten, deshalb ist ein lokaler Tab sicherer als ein Online-Unserializer, der Daten an einen Server sendet
Theorie und Gegenmaßnahmen: Serialisierungsleitfaden, Sicherheit

Was der Parser akzeptiert und wie WordPress-Zeilen aussehen

Typ-Präfixe in einem typischen option_value

Jedes Token beginnt mit einem Buchstaben. Der FastMinify-Unserializer akzeptiert dieselbe Teilmenge, die er auch serialisieren kann: null, bool, int, float, String und verschachtelte Arrays. Objekte und Referenzen führen zu einem Fehler und werden nicht stillschweigend übersprungen.

Vorher

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

Nachher

{ "blogname": "FastMinify", "description": "Local developer tools.", "WPLANG": "en_US" }
a:N:{…}: Array mit N Schlüssel-Wert-Paaren (assoziativ oder indiziert)
s:n:"…" ist ein String, wobei n die Länge in Bytes angibt und nicht die Zahl der UTF-8-Zeichen
i: Integer, d: Float, b:0/b:1 Bool, N; null
O:8:"stdClass" und R: / r: werden hier nicht dekodiert
Eine abgeschnittene Zeichenkette wie s:3:"hello" ohne abschließendes Semikolon schlägt fehl, statt den Rest des Arrays zu verfälschen. Das Tool vergleicht die Zahl nicht mit der Textlänge, prüfen Sie sie bei Bedarf in PHP
Ein verschachteltes wp_postmeta-Array lesen

Anhangs-Metadaten und manche benutzerdefinierten Felder (etwa ACF-Beziehungs- oder Checkbox-Felder) sind Arrays aus Zahlen und Zeichenketten. Das ist genau die Teilmenge, die dieser Parser verarbeitet. Fügen Sie die Zelle ein, klicken Sie auf Deserialisieren und kopieren Sie das JSON.

Vorher

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

Nachher

{ "width": 1200, "height": 630 }
phpMyAdmin / TablePlus: die rohe Zelle kopieren, nicht die gekürzte Vorschau
WP-CLI wp option get … --format=json deserialisiert bereits in PHP, FastMinify brauchen Sie nur, wenn Ihnen lediglich der SQL-Dump vorliegt
Nach dem Dekodieren bietet die Symbolleiste JSON (Standard) oder PHP-Array-Syntax sowie Einzugsgröße und Leerzeichen oder Tabs
Die optionalen Filter verändern die Nutzlast, wenn sie Nullwerte, leere Arrays oder leere Objekte entfernen oder Schlüssel sortieren. Lassen Sie sie für eine originalgetreue Prüfung aus
Kompaktes JSON für ein Ticket: online JSON-Minifizierer auf der kopierten Ausgabe
Sessions, Laravel-Caches und die Grenze bei Objekten

PHP-Sessiondateien und manche Laravel-Cache-Treiber speichern serialize()-Nutzlasten. Ist der Wert ein Array aus Skalaren, funktioniert das Tool im Browser. Bei einem Eloquent-Modell, einer Carbon-Instanz oder einer beliebigen O:-Klasse gibt FastMinify eine eindeutige Fehlermeldung aus. Das ist so gewollt, denn das Tool gibt nicht vor, das unserialize von PHP zu sein.

Laravel Cache::put mit einem einfachen Array ergibt meist a:, also einfügen und dekodieren
Laravel-Eloquent-Modelle und eigene DTOs ergeben O:, dekodieren Sie sie deshalb in PHP mit einer Allowlist und nicht hier
Verschlüsselte Cookies und encrypt()-Nutzlasten sind kein serialize(), entschlüsseln Sie sie deshalb zuerst in der Anwendung
igbinary- und JSON-Caches sind kein PHP-serialize(), prüfen Sie daher vor dem Einfügen den Cache-Treiber
Wie in der Dokumentation des Tools gilt: kein O:, kein R:, keine Objektausführung

Im Browser deserialisieren, am konkreten WordPress-Beispiel

Den PHP-Unserializer nutzen

Öffnen Sie den PHP-Unserializer, fügen Sie eine einzelne serialisierte Zeichenkette ein und klicken Sie auf Deserialisieren. Die Ausgabe ist standardmäßig JSON (Einzug 2, Leerzeichen). Wechseln Sie zur PHP-Array-Syntax, wenn Sie das Ergebnis in ein Skript zurückkopieren. Alles bleibt im Tab, ohne Konto und ohne Serveraufruf.

Akzeptiert: null, Booleans, Integer, Floats, Strings und verschachtelte Arrays
Abgelehnt: Klassenobjekte vom Typ O, Referenzen der Typen R und r sowie abgeschnittene Strings. Die angegebene Länge wird nicht geprüft
Optionen: Ausgabe als JSON oder PHP-Array, Nullwerte einschließen (standardmäßig an), leere Arrays und Objekte entfernen, Schlüssel sortieren, Einzugsgröße, Leerzeichen oder Tabs
Kein Werkzeug für WordPress-SQL-Migrationen: ändern Sie Stringlängen in einem Dump nicht von Hand
Eine Widget-Instanz in wp_options

Ein Seitenleisten-Widget ist nach einer Migration leer. Die Option widget_* ist ein serialisiertes Array. Sie müssen sehen, welche Schlüssel erhalten geblieben sind, statt sie aus einer Zelle mit 400 Zeichen zu erraten.

1

1. Den rohen option_value kopieren

Kopieren Sie aus SQL oder WP-CLI die vollständige Zeichenkette ab a:. Gekürzte Vorschauen mit … lassen sich nicht auslesen.

2

2. In php-unserialize einfügen

Öffnen Sie php-unserialize und lassen Sie die Ausgabe auf JSON. Erscheint ein Fehler zu einem unbekannten Format bei O:, hat das Widget ein Objekt gespeichert. Hören Sie hier auf und verwenden Sie PHP mit allowed_classes.

3

3. JSON bearbeiten und nur bei Bedarf neu serialisieren

Korrigieren Sie die Schlüssel im JSON und kodieren Sie es danach mit php-serialize erneut. Dieser Roundtrip gilt für Arrays und Skalare, die dieser Parser unterstützt. Das Ergebnis stimmt nicht Byte für Byte mit dem ursprünglichen WordPress-String überein (Reihenfolge der Schlüssel, Leerzeichen). Verwenden Sie wenn möglich WP-CLI wp option update mit JSON.

Ein Laravel-Cache-Dump in Redis

Redis zeigt einen Wert, der mit a: beginnt. Sie möchten wissen, welche Konfigurationsschlüssel in der Nutzlast stecken, bevor Sie den Schlüssel löschen.

1

1. Den Wert als Rohtext kopieren

redis-cli maskiert die Anführungszeichen in einem Wert, solange Sie nicht den Raw-Modus nutzen. Kopieren Sie den Wert daher als Rohtext. Steht vor dem ersten a: oder s: noch etwas, etwa der Ablaufzeitstempel, den der Datei-Cache-Treiber von Laravel zuerst schreibt, entfernen Sie es.

2

2. Lokal dekodieren

Fügen Sie die Zeichenkette in den Unserializer ein. Verschachtelte Arrays werden zu JSON-Objekten oder -Arrays. Nullwerte bleiben erhalten, solange die Option für Nullwerte aktiv ist (Standard).

3

3. Objekt-Nutzlasten PHP überlassen

Ein Klassen-Token wie Illuminate\… löst einen Fehler aus. Das Tool verhält sich wie dokumentiert, der Redis-Dump ist nicht defekt.

Wann Sie weiterhin PHP brauchen (und wie der Array-Roundtrip läuft)

allowed_classes auf false gesetzt, die Prüfung auf der PHP-Seite

Enthält der Blob Objekte oder arbeiten Sie in einem Deployment-Skript, dekodieren Sie in PHP, ohne Klassen zu instanziieren. Objekte der Klasse __PHP_Incomplete_Class nennen den Klassennamen, ohne Konstruktoren auszuführen. FastMinify ersetzt diesen Schutz nicht.

Einfaches Beispiel

<?php // Untrusted serialize()-Dump prüfen, ohne Klassen zu instanziieren (PHP 7+). $raw = file_get_contents('option_value.txt'); $value = unserialize($raw, ['allowed_classes' => false]); var_export($value);
maybe_unserialize und WP-CLI in WordPress

Der WordPress-Core kennt das Format bereits. maybe_unserialize() liefert Arrays als Arrays, und WP-CLI gibt JSON aus, sodass Sie Längenangaben nie von Hand ändern. Nutzen Sie FastMinify, wenn Ihnen nur ein SQL-Export oder ein Text aus einem Ticket vorliegt. Schreiben Sie zurück über die WordPress-APIs, nicht per rohem UPDATE auf einen von Hand geänderten serialize()-String.

Einfaches Beispiel

# Option als JSON lesen (WordPress unserialisiert in PHP). wp option get widget_text --format=json # Aus einer JSON-Datei aktualisieren statt s:n:\"…\" in SQL zu patchen. wp option update my_plugin_settings "$(cat settings.json)" --format=json
Roundtrip im Browser, nur Arrays

Dekodieren Sie mit php-unserialize, bearbeiten Sie das JSON und kodieren Sie es mit php-serialize. Verschachtelte JSON-Objekte werden zu PHP-Arrays, nicht zu O:-Objekten. Wer Schlüssel sortiert oder Nullwerte und leere Strukturen entfernt, ändert, was er zurückschreibt. Die Dokumentation des Tools sagt es deutlich: Es ist kein byte-genaues Werkzeug für WordPress-SQL-Migrationen. Für CSS und JS derselben Seite nutzen Sie den WordPress-Minifizierungsleitfaden, eine andere Pipeline.

Einfaches Beispiel

// Browser-Schleife (nur Arrays/Skalare): // 1. serialize()-String einfügen → php-unserialize → JSON // 2. JSON bearbeiten // 3. JSON einfügen → php-serialize → neuer a:…-String // Kein UPDATE von wp_options mit handeditiertem s:n:"…"-Präfix.

Zusammenfassung

Fügen Sie die serialize()-Zeichenkette ein und lesen Sie das JSON. Entscheiden Sie dann, ob die Nutzlast ein Array für den Roundtrip ist oder ein Objekt, das in PHP gehört. FastMinify prüft lokal und lehnt O:/R: ab. Es ersetzt weder unserialize() noch WP-CLI und ist kein sicheres Suchen-und-Ersetzen für MySQL-Dumps. Für das Format im Detail halten Sie den PHP-Serialisierungsleitfaden bereit.

Die ganze Zelle kopieren, denn gekürzte Strings lassen sich nicht auslesen
O:-Nutzlasten PHP mit allowed_classes auf false überlassen
Stringlängen in SQL nicht von Hand ändern
Nur Arrays hin und zurück umwandeln: unserialize → JSON → serialize
Dumps im Browser lassen; option_value kann Secrets enthalten
Teilen Sie diesen Artikel
Teilen Sie diesen Artikel: