Start · Sprachen · PHP · Referenz · gzdecode

gzdecode

Funktion

Dekodiert eine gzip-komprimierte Zeichenkette und gibt die ursprünglichen Rohdaten zurück.

seit PHP 5.4.0 Kategorie: io

Signatur

gzdecode(string $data, int $max_length = -1): string|false

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

Typ
string|false
Beschreibung
Gibt die dekomprimierte Zeichenkette bei Erfolg zurück. Bei einem Fehler (z. B. ungültige gzip-Daten oder überschrittenes 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
Komprimierte Größe: 63 Byte Dekomprimiert: Hallo Welt! Dies ist ein Teststring für gzip-Komprimierung. bool(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.