Start · Sprachen · PHP · Referenz · unserialize

unserialize

Funktion

Wandelt einen durch <code>serialize()</code> erzeugten String zurück in einen PHP-Wert (Objekt, Array, Skalar etc.).

seit PHP 4.0.0 Kategorie: type

Signatur

unserialize(string $data, array $options = []): mixed

Beschreibung

unserialize() rekonstruiert einen PHP-Wert aus einem serialisierten String, wie er typischerweise von serialize() erzeugt wurde. Das umfasst skalare Werte, Arrays, Objekte, null und false. Beim Deserialisieren von Objekten wird automatisch die entsprechende Klasse instanziiert und die Methode __wakeup() aufgerufen, sofern sie definiert ist.

Seit PHP 7.0 unterstützt die Funktion einen zweiten Parameter $options mit dem Schlüssel allowed_classes. Damit lässt sich einschränken, welche Klassen bei der Deserialisierung instanziiert werden dürfen. Dies ist der empfohlene Weg, um unsichere Objektinstanziierungen zu verhindern.

Typische Einsatzfälle sind das Lesen von in Datenbanken oder Dateien gespeicherten PHP-Strukturen, das Empfangen von Session-Daten sowie das Wiederherstellen von Cache-Einträgen. Für den Datenaustausch mit anderen Sprachen empfiehlt sich jedoch json_decode(), da das Serialisierungsformat PHP-spezifisch ist.

Gibt die Funktion false zurück oder kann der übergebene String nicht deserialisiert werden, wird ein E_NOTICE-Fehler ausgelöst. Bei komplexen Objektgraphen mit zirkulären Referenzen kann es zu unerwartetem Verhalten kommen.

Parameter

Name Typ Default Beschreibung
$data Pflicht string Der serialisierte String, der in einen PHP-Wert umgewandelt werden soll. Muss ein gültiger, von serialize() erzeugter String sein.
$options array []

Assoziatives Array mit Steueroptionen. Unterstützter Schlüssel:

  • allowed_classes: true erlaubt alle Klassen (Standard), false erlaubt keine Klassen (Objekte werden zu __PHP_Incomplete_Class), oder ein Array mit erlaubten Klassennamen als Strings.

Rückgabewert

Typ
mixed
Beschreibung
Gibt den deserialisierten Wert zurück. Dies kann ein beliebiger PHP-Typ sein (Objekt, Array, String, Integer, Float, Boolean, null). Gibt false zurück, wenn der String nicht deserialisiert werden konnte – außer wenn der ursprüngliche Wert selbst false war (in diesem Fall ist das Ergebnis korrekt false).

Beispiele

Einfaches Array deserialisieren

<?php
$original = ['name' => 'Alice', 'age' => 30, 'active' => true];
$serialized = serialize($original);

// Später aus Datenbank oder Cache laden:
$restored = unserialize($serialized);

print_r($restored);
// Ausgabe: Array ( [name] => Alice [age] => 30 [active] => 1 )
Array ( [name] => Alice [age] => 30 [active] => 1 )

Objekt deserialisieren mit allowed_classes

<?php
class User {
    public string $name;
    public function __construct(string $name) {
        $this->name = $name;
    }
    public function __wakeup(): void {
        echo "User '{$this->name}' wurde wiederhergestellt.\n";
    }
}

$user = new User('Bob');
$serialized = serialize($user);

// Nur 'User'-Klasse erlauben:
$restored = unserialize($serialized, ['allowed_classes' => ['User']]);
echo $restored->name;

// Alle Klassen verbieten (sicher bei Fremddaten):
$unsafe = unserialize($serialized, ['allowed_classes' => false]);
echo get_class($unsafe); // __PHP_Incomplete_Class
User 'Bob' wurde wiederhergestellt. Bob __PHP_Incomplete_Class

Fehlerbehandlung beim Deserialisieren

<?php
$invalid = 'das:ist:kein:gueltiger:string';

$result = @unserialize($invalid);

if ($result === false) {
    echo "Deserialisierung fehlgeschlagen oder Wert war false.\n";
} else {
    var_dump($result);
}
Deserialisierung fehlgeschlagen oder Wert war false.

// Wichtig · Fallstricke

Sicherheitswarnung: Das Deserialisieren von Daten aus nicht vertrauenswürdigen Quellen (z. B. Benutzereingaben, HTTP-Anfragen, externe APIs) ist extrem gefährlich und kann zu Remote Code Execution (RCE) führen. Angreifer können speziell präparierte Strings übergeben, die beim Deserialisieren schadhaften Code via __wakeup(), __destruct() oder __toString() ausführen.

  • Nutze immer den Parameter allowed_classes und setze ihn auf false oder ein Minimum erlaubter Klassen, wenn du externe Daten verarbeitest.
  • Für den sicheren Datenaustausch verwende stattdessen json_decode() / json_encode().
  • Überprüfe serialisierte Daten vor der Deserialisierung mit einem HMAC oder einer digitalen Signatur, um Manipulation auszuschließen.
  • PHP-Sessions verwenden intern unserialize() – sichere daher Session-Daten entsprechend ab.