Signatur
Beschreibung
gzdecode() dekomprimiert eine Zeichenkette, die im gzip-Format (RFC 1952) vorliegt, und gibt die ursprünglichen, unkomprimierten Daten zurück. Die Funktion ist das String-Pendant zu gzinflate(), erwartet jedoch vollständige gzip-Daten inklusive Header und Prüfsumme – nicht nur den rohen Deflate-Stream.
Typische Einsatzgebiete sind das Verarbeiten von HTTP-Antworten mit Content-Encoding: gzip, das Lesen von gzip-komprimierten Daten aus Datenbanken oder das Dekomprimieren von Daten, die zuvor mit gzencode() erzeugt wurden.
Mit dem optionalen Parameter max_length lässt sich die maximale Größe der unkomprimierten Ausgabe begrenzen, was bei der Verarbeitung nicht vertrauenswürdiger Daten empfohlen wird, um sogenannte Zip-Bomb-Angriffe zu verhindern.
Im Gegensatz zu gzuncompress() (zlib-Format) und gzinflate() (raw Deflate) verarbeitet gzdecode() ausschließlich das vollständige gzip-Format.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $data Pflicht | string | Die gzip-komprimierte Zeichenkette, die dekodiert werden soll. Muss einen gültigen gzip-Header und eine gültige Prüfsumme enthalten. | |
| $max_length | int | -1 | Maximale Länge der unkomprimierten Ausgabe in Byte. Der Wert -1 (Standard) bedeutet keine Begrenzung. Wird empfohlen, um bei fremden Daten eine übermäßige Speichernutzung zu verhindern. |
Rückgabewert
max_length-Limit) wird false zurückgegeben.Beispiele
Einfaches Komprimieren und Dekomprimieren
<?php
$original = 'Hallo Welt! Dies ist ein Teststring für gzip-Komprimierung.';
// Komprimieren mit gzencode
$compressed = gzencode($original);
echo 'Komprimierte Größe: ' . strlen($compressed) . ' Byte' . PHP_EOL;
// Dekomprimieren mit gzdecode
$decoded = gzdecode($compressed);
echo 'Dekomprimiert: ' . $decoded . PHP_EOL;
var_dump($original === $decoded); // true
Verarbeitung einer gzip-kodierten HTTP-Antwort
<?php
// Beispiel: gzip-kodierte Antwort eines HTTP-Servers verarbeiten
$context = stream_context_create([
'http' => [
'header' => "Accept-Encoding: gzip\r\n"
]
]);
$response = @file_get_contents('https://example.com', false, $context);
if ($response !== false) {
// Prüfen ob die Antwort gzip-kodiert ist
$headers = implode('\n', $http_response_header ?? []);
if (stripos($headers, 'Content-Encoding: gzip') !== false) {
$decoded = gzdecode($response);
if ($decoded !== false) {
echo substr($decoded, 0, 100) . '...';
} else {
echo 'Fehler beim Dekodieren der gzip-Daten.';
}
} else {
echo substr($response, 0, 100) . '...';
}
}
Schutz vor Zip-Bombs mit max_length
<?php
$maxBytes = 1024 * 1024; // 1 MB Limit
$compressedData = file_get_contents('/tmp/user_upload.gz');
if ($compressedData === false) {
die('Datei konnte nicht gelesen werden.');
}
$decoded = gzdecode($compressedData, $maxBytes);
if ($decoded === false) {
echo 'Fehler: Datei konnte nicht dekomprimiert werden oder überschreitet das Größenlimit.';
} else {
echo 'Erfolgreich dekomprimiert: ' . strlen($decoded) . ' Byte';
}
// Wichtig · Fallstricke
Sicherheit – Zip-Bomb-Schutz: Komprimierte Daten aus nicht vertrauenswürdigen Quellen (z. B. Nutzer-Uploads) können beim Dekomprimieren um ein Vielfaches größer werden. Setze stets einen sinnvollen Wert für max_length, um einen unkontrollierten Speicherverbrauch zu verhindern.
Format-Unterschiede: Die drei ähnlichen Funktionen unterscheiden sich im erwarteten Format: gzdecode() erwartet das vollständige gzip-Format (mit Header/CRC, RFC 1952), gzuncompress() erwartet zlib-Daten (RFC 1950, mit zlib-Header) und gzinflate() erwartet rohe DEFLATE-Daten (RFC 1951, ohne Header). Das Verwechseln dieser Formate führt zu false als Rückgabewert.
Fehlerbehandlung: Der Rückgabewert sollte immer mit === false geprüft werden, da eine leere Zeichenkette als unkomprimiertes Ergebnis ebenfalls möglich ist.