Start · Sprachen · PHP · Referenz · gzinflate

gzinflate

Funktion

Dekomprimiert eine mit DEFLATE komprimierte Zeichenkette und gibt die ursprünglichen Daten zurück.

seit PHP 4.0.4 Kategorie: io

Signatur

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

Beschreibung

gzinflate() dekomprimiert eine Zeichenkette, die mit dem rohen DEFLATE-Algorithmus komprimiert wurde. Die Funktion ist das Gegenstück zu gzdeflate() und arbeitet mit dem rohen DEFLATE-Format — also ohne den gzip-Header, wie er bei gzdecode() oder gzuncompress() erwartet wird.

Typische Einsatzgebiete sind die Dekomprimierung von HTTP-Antworten, die mit Content-Encoding: deflate übertragen wurden, sowie die Verarbeitung von binären Daten, die z. B. aus Datenbanken oder Dateien stammen und zuvor mit gzdeflate() komprimiert wurden.

Mit dem optionalen Parameter max_length lässt sich die maximale Größe der dekodierten Ausgabe begrenzen. Das kann sinnvoll sein, um sogenannte Zip-Bomb-Angriffe zu entschärfen, bei denen winzige komprimierte Eingaben zu riesigen Ausgaben führen. Wird der Grenzwert überschritten, gibt die Funktion false zurück.

Im Gegensatz zu gzuncompress() (zlib-Format mit Header/Prüfsumme) und gzdecode() (gzip-Format) erwartet gzinflate() ausschließlich rohe DEFLATE-komprimierte Daten ohne Wrapper. Bei falschen Eingabedaten oder beschädigten Streams wird ebenfalls false zurückgegeben.

Parameter

Name Typ Default Beschreibung
$data Pflicht string Die mit DEFLATE (roh, ohne Header) komprimierte Zeichenkette, die dekomprimiert werden soll.
$max_length int 0 Maximale Länge der dekomprimierten Ausgabe in Bytes. 0 bedeutet keine Begrenzung. Wird der Wert überschritten, gibt die Funktion false zurück.

Rückgabewert

Typ
string|false
Beschreibung
Gibt die dekomprimierte Zeichenkette zurück. Im Fehlerfall — z. B. bei ungültigen Eingabedaten oder Überschreitung von max_length — wird false zurückgegeben.

Beispiele

Einfaches Komprimieren und Dekomprimieren mit gzdeflate/gzinflate

<?php
$original = 'Das ist ein Testtext, der komprimiert und wieder dekomprimiert wird.';

// Komprimieren mit gzdeflate (roh, DEFLATE)
$compressed = gzdeflate($original, 9);
echo 'Komprimiert: ' . strlen($compressed) . ' Bytes' . PHP_EOL;

// Dekomprimieren mit gzinflate
$decompressed = gzinflate($compressed);

if ($decompressed === false) {
    echo 'Fehler beim Dekomprimieren!' . PHP_EOL;
} else {
    echo 'Dekomprimiert: ' . $decompressed . PHP_EOL;
    echo 'Identisch: ' . ($decompressed === $original ? 'Ja' : 'Nein') . PHP_EOL;
}
Komprimiert: 52 Bytes Dekomprimiert: Das ist ein Testtext, der komprimiert und wieder dekomprimiert wird. Identisch: Ja

Schutz vor Zip-Bombs mit max_length

<?php
// Sehr repetitiven Text komprimieren (hohe Kompressionrate)
$bigText = str_repeat('AAAA', 100000); // 400 000 Bytes
$compressed = gzdeflate($bigText, 9);
echo 'Komprimiert: ' . strlen($compressed) . ' Bytes' . PHP_EOL;

// Maximale dekomprimierte Größe auf 1000 Bytes begrenzen
$result = gzinflate($compressed, 1000);

if ($result === false) {
    echo 'Dekomprimierung abgebrochen: Ausgabe würde Limit überschreiten.' . PHP_EOL;
} else {
    echo 'Dekomprimiert: ' . strlen($result) . ' Bytes' . PHP_EOL;
}
Komprimiert: 406 Bytes Dekomprimierung abgebrochen: Ausgabe würde Limit überschreiten.

Dekomprimierung einer HTTP-Antwort mit deflate-Encoding

<?php
// Simuliert eine HTTP-Antwort mit Content-Encoding: deflate
// Viele Webserver senden tatsächlich raw DEFLATE (ohne zlib-Wrapper)
$responseBody = gzdeflate('{ "status": "ok", "value": 42 }');

$decoded = gzinflate($responseBody);
if ($decoded !== false) {
    $data = json_decode($decoded, true);
    echo 'Status: ' . $data['status'] . PHP_EOL;
    echo 'Wert: ' . $data['value'] . PHP_EOL;
} else {
    echo 'Dekomprimierung fehlgeschlagen.' . PHP_EOL;
}
Status: ok Wert: 42

// Wichtig · Fallstricke

Formatunterschiede beachten: gzinflate() erwartet ausschließlich rohe DEFLATE-Daten. Daten im zlib-Format (mit 2-Byte-Header und Adler-32-Prüfsumme) müssen mit gzuncompress() dekomprimiert werden, Daten im gzip-Format mit gzdecode(). Die Funktionen sind nicht untereinander austauschbar.

Sicherheitshinweis (Zip-Bomb): Unkontrollierte Dekomprimierung von Benutzereingaben kann zu massivem Speicherverbrauch führen. Es empfiehlt sich, den Parameter max_length stets auf einen sinnvollen Maximalwert zu setzen, wenn die Eingabequelle nicht vertrauenswürdig ist.

Fehlerbehandlung: Der Rückgabewert false sollte mit === false geprüft werden, da ein leerer String '' ein gültiges Dekomprimierungsergebnis sein kann.