Signatur
Beschreibung
gzuncompress() dekomprimiert einen String, der zuvor mit dem ZLIB-Algorithmus (RFC 1950) komprimiert wurde – typischerweise mit der Funktion gzcompress(). Das Ergebnis ist der ursprüngliche, unkomprimierte Daten-String.
Im Gegensatz zu gzinflate() erwartet gzuncompress() einen vollständigen ZLIB-komprimierten Datenstrom inklusive Header und Prüfsumme (Adler-32). Es ist daher nicht für GZIP-Daten (RFC 1952) geeignet – für GZIP-komprimierte Inhalte steht gzdecode() zur Verfügung.
Der optionale Parameter max_length begrenzt die maximale Größe des dekomprimierten Ergebnisses. Das schützt vor sogenannten ZIP-Bomb-Angriffen, bei denen kleine komprimierte Datenmengen zu extrem großen unkomprimierten Daten führen. Wird die Grenze überschritten, gibt die Funktion false zurück.
Typische Einsatzgebiete sind das Wiederherstellen von Daten, die zuvor platzsparend in einer Datenbank oder Datei gespeichert wurden, sowie das Dekomprimieren von Netzwerk-Payloads.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $data Pflicht | string | Der ZLIB-komprimierte String, der dekomprimiert werden soll. Muss von gzcompress() oder einem kompatiblen ZLIB-Encoder stammen. |
|
| $max_length | int | -1 | Maximale Länge (in Bytes) des dekomprimierten Ergebnisses. -1 bedeutet keine Begrenzung. Wird der Wert überschritten, gibt die Funktion false zurück. |
Rückgabewert
max_length) wird false zurückgegeben.Beispiele
Einfaches Komprimieren und Dekomprimieren
<?php
$original = 'Hallo Welt! Dies ist ein Beispieltext, der komprimiert und wieder dekomprimiert wird.';
$compressed = gzcompress($original);
echo 'Komprimierte Länge: ' . strlen($compressed) . ' Bytes' . PHP_EOL;
$decompressed = gzuncompress($compressed);
echo 'Dekomprimiert: ' . $decompressed . PHP_EOL;
var_dump($original === $decompressed); // sollte true sein
Schutz vor ZIP-Bomb mit max_length
<?php
// Komprimierte Daten aus einer nicht vertrauenswürdigen Quelle
$data = file_get_contents('/tmp/daten.zlib');
// Dekomprimierung auf maximal 1 MB begrenzen
$maxBytes = 1024 * 1024; // 1 MB
$result = gzuncompress($data, $maxBytes);
if ($result === false) {
echo 'Fehler: Dekomprimierung fehlgeschlagen oder Limit überschritten.';
} else {
echo 'Dekomprimierte Größe: ' . strlen($result) . ' Bytes';
}
Speicherung komprimierter Daten in einer Datenbank
<?php
// Speichern
$payload = json_encode(['key' => 'value', 'data' => range(1, 1000)]);
$stored = base64_encode(gzcompress($payload, 9));
// $stored kann in einer TEXT-Spalte der Datenbank gespeichert werden
// Lesen
$retrieved = $stored; // aus der Datenbank gelesen
$restored = gzuncompress(base64_decode($retrieved));
$decodedData = json_decode($restored, true);
echo 'Anzahl Datenpunkte: ' . count($decodedData['data']);
// Wichtig · Fallstricke
Format-Kompatibilität: gzuncompress() verarbeitet ausschließlich ZLIB-Daten (RFC 1950). Für GZIP-komprimierte Daten (z. B. HTTP-Antworten mit Content-Encoding: gzip) muss stattdessen gzdecode() oder zlib_decode() verwendet werden. Für rohe Deflate-Streams ohne Header eignet sich gzinflate().
Sicherheit – ZIP-Bomb: Werden komprimierte Daten aus fremden Quellen (Benutzereingabe, API, Datei-Upload) entgegengenommen, ist der Parameter max_length unbedingt zu setzen. Hochkomprimierte Daten können beim Dekomprimieren zu gigantischen Datenmengen anschwellen und den Server-Speicher erschöpfen.
Fehlerbehandlung: Bei einem Fehler wird false zurückgegeben und ggf. eine PHP-Warnung erzeugt. Eine Rückgabe sollte daher stets mit === false geprüft werden.