Start · Sprachen · PHP · Referenz · zlib_decode

zlib_decode

Funktion

Dekomprimiert raw-deflate-, gzip- oder zlib-kodierte Binärdaten und gibt den unkomprimierten String zurück.

seit PHP 5.4.0 Kategorie: io

Signatur

zlib_decode(string $data, int $max_length = 0): string|false

Beschreibung

zlib_decode() ist eine universelle Dekomprimierungsfunktion, die alle drei gängigen zlib-Formate automatisch erkennt und verarbeitet: raw deflate (ohne Header), gzip (RFC 1952) und zlib (RFC 1950, mit zlib-Header). Sie ist damit die flexible Alternative zu den spezialisierten Funktionen gzdecode(), gzinflate() und gzuncompress().

Der optionale Parameter $max_length begrenzt die maximale Größe der dekomprimierten Ausgabe. Das ist besonders wichtig, um sogenannte Zip-Bomb-Angriffe zu verhindern, bei denen kleine komprimierte Eingaben eine extrem große unkomprimierte Ausgabe erzeugen und so den Arbeitsspeicher erschöpfen würden.

Typische Einsatzgebiete sind HTTP-Antworten mit Content-Encoding: gzip oder deflate, das Einlesen von .gz-Dateien als Strings, oder die Verarbeitung komprimierter Daten aus externen Quellen und Datenbanken, wenn das genaue Format nicht im Voraus bekannt ist.

Im Fehlerfall – etwa bei ungültigen oder beschädigten Eingabedaten – gibt die Funktion false zurück. Eine PHP-Warnung wird ebenfalls ausgelöst, die per @-Operator oder set_error_handler() behandelt werden kann.

Parameter

Name Typ Default Beschreibung
$data Pflicht string Die komprimierten Binärdaten im raw-deflate-, gzip- oder zlib-Format, die dekomprimiert werden sollen.
$max_length int 0 Maximale Länge der dekomprimierten Ausgabe in Bytes. 0 bedeutet kein Limit. Sollte bei nicht vertrauenswürdigen Eingaben immer gesetzt werden, um Speichererschöpfung zu verhindern.

Rückgabewert

Typ
string|false
Beschreibung
Gibt den dekomprimierten String zurück. Bei einem Fehler (ungültige Daten, überschrittenes $max_length-Limit oder unbekanntes Format) wird false zurückgegeben.

Beispiele

Gzip-kodierte HTTP-Antwort dekomprimieren

<?php
// Simuliert eine gzip-komprimierte HTTP-Antwort
$original = 'Das ist ein Beispieltext für die Komprimierung.';
$compressed = gzencode($original); // gzip-Format

$decoded = zlib_decode($compressed);

if ($decoded === false) {
    echo 'Dekomprimierung fehlgeschlagen.';
} else {
    echo $decoded;
}
Das ist ein Beispieltext für die Komprimierung.

Verschiedene zlib-Formate automatisch erkennen

<?php
$original = 'Hallo, Welt!';

$formats = [
    'gzip'         => gzencode($original),
    'zlib/compress' => gzcompress($original),
    'raw deflate'  => gzdeflate($original),
];

foreach ($formats as $name => $compressed) {
    $result = zlib_decode($compressed);
    echo "$name: " . ($result === $original ? 'OK' : 'FEHLER') . "\n";
}
gzip: OK zlib/compress: OK raw deflate: OK

Maximale Ausgabegröße begrenzen (Schutz vor Zip-Bombs)

<?php
$grosserText = str_repeat('A', 100_000);
$compressed = gzcompress($grosserText);

// Ausgabe auf maximal 1000 Bytes begrenzen
$result = zlib_decode($compressed, 1000);

if ($result === false) {
    echo 'Dekomprimierung abgebrochen: Ausgabe zu groß oder Fehler.';
} else {
    echo 'Dekomprimierte Länge: ' . strlen($result) . ' Bytes';
}
Dekomprimierung abgebrochen: Ausgabe zu groß oder Fehler.

// Wichtig · Fallstricke

Sicherheitshinweis – Zip-Bomb-Schutz: Setze $max_length immer auf einen sinnvollen Wert, wenn die Eingabedaten aus nicht vertrauenswürdigen Quellen stammen (z. B. Nutzereingaben, externe APIs). Ohne diese Begrenzung kann ein Angreifer mit einem wenige Kilobyte großen Eingabe-String mehrere Gigabyte Arbeitsspeicher verbrauchen und das System zum Absturz bringen.

Format-Erkennung: Die automatische Format-Erkennung funktioniert anhand von Magic Bytes im Header. Sie ist in der Praxis sehr zuverlässig, kann aber bei beschädigten oder abgeschnittenen Daten scheitern. In diesem Fall wird false zurückgegeben.

Rückgabewert prüfen: Verwende stets eine strikte Überprüfung mit === false, da ein leerer String '' ein gültiges Dekomprimierungsergebnis sein kann.