Signatur
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:
|
Rückgabewert
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 )
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
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);
}
// 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_classesund setze ihn auffalseoder 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.