Start · Sprachen · PHP · Referenz · hash_update_file

hash_update_file

Funktion

Liest eine Datei und fügt deren Inhalt an einen aktiven <code>HashContext</code> an, ohne die Datei manuell einlesen zu müssen.

seit PHP 5.1.2 Kategorie: crypto

Signatur

hash_update_file(HashContext $context, string $filename, ?resource $context = null): bool

Beschreibung

hash_update_file() ermöglicht es, den Inhalt einer Datei direkt in einen laufenden Hash-Berechnungsprozess einzuspeisen. Statt die Datei manuell zu öffnen und ihren Inhalt Stück für Stück mit hash_update() zu verarbeiten, übernimmt diese Funktion das Lesen vollständig intern – das spart Code und ist gedächtniseffizient, weil die Datei nicht komplett in den Speicher geladen werden muss.

Die Funktion arbeitet zusammen mit hash_init() (zum Erstellen des Kontexts) und hash_final() (zum Abschließen der Berechnung und Abrufen des Hash-Werts). Zwischen diesen Aufrufen kann hash_update_file() beliebig oft aufgerufen werden, um mehrere Dateien oder Dateien kombiniert mit Strings (hash_update()) zu hashen.

Über den optionalen dritten Parameter $context lässt sich ein Stream-Kontext übergeben, etwa um HTTP-Authentifizierung oder spezielle SSL-Einstellungen für entfernte Dateien zu konfigurieren – denn die Funktion unterstützt alle von PHP unterstützten Stream-Wrapper, also auch http://, ftp:// etc.

Typische Einsatzgebiete sind die Integritätsprüfung von Uploads, die Erzeugung von Checksums für Backup-Dateien oder das kombinierte Hashen mehrerer Dateien (z. B. um einen Fingerabdruck eines Verzeichnisinhalts zu erzeugen).

Parameter

Name Typ Default Beschreibung
$context Pflicht HashContext Ein aktiver Hash-Kontext, der zuvor mit hash_init() erzeugt wurde. Der Kontext wird in-place aktualisiert.
$filename Pflicht string Pfad zur Datei, deren Inhalt in den Hash-Kontext eingespeist wird. Es werden alle von PHP unterstützten Stream-Wrapper akzeptiert (z. B. file://, http://, phar://).
$context resource null Optionaler Stream-Kontext (erzeugt mit stream_context_create()), der für das Öffnen der Datei verwendet wird. Nützlich bei entfernten Ressourcen, die Authentifizierung oder besondere Transportoptionen erfordern.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück. Gibt false zurück, wenn die Datei nicht geöffnet oder gelesen werden konnte (z. B. Datei nicht vorhanden, fehlende Leserechte).

Beispiele

SHA-256-Prüfsumme einer Datei berechnen

<?php
$file = '/var/www/uploads/document.pdf';

$ctx = hash_init('sha256');

if (!hash_update_file($ctx, $file)) {
    throw new RuntimeException('Datei konnte nicht gelesen werden: ' . $file);
}

$checksum = hash_final($ctx);

echo 'SHA-256: ' . $checksum . PHP_EOL;
SHA-256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Mehrere Dateien und einen String kombiniert hashen

<?php
// Gemeinsamen Hash aus Konfigurationsdatei + Inhalt + Salt erzeugen
$ctx = hash_init('sha512');

// Salt voranstellen
hash_update($ctx, 'mein-geheimer-salt');

// Zwei Dateien einlesen
hash_update_file($ctx, '/etc/app/config.json');
hash_update_file($ctx, '/etc/app/routes.json');

// Ergebnis
$fingerprint = hash_final($ctx);
echo 'Fingerabdruck: ' . $fingerprint . PHP_EOL;

Remote-Datei über HTTP hashen (mit Stream-Kontext)

<?php
$streamCtx = stream_context_create([
    'http' => [
        'timeout' => 10,
        'user_agent' => 'PHP-Hash-Checker/1.0',
    ],
]);

$ctx = hash_init('md5');

if (hash_update_file($ctx, 'https://example.com/somefile.zip', $streamCtx)) {
    echo 'MD5: ' . hash_final($ctx) . PHP_EOL;
} else {
    echo 'Datei konnte nicht abgerufen werden.' . PHP_EOL;
}

// Wichtig · Fallstricke

Sicherheitshinweis: Wird der Dateiname aus Benutzereingaben bezogen, muss er sorgfältig validiert werden, um Path-Traversal-Angriffe (../../etc/passwd) oder den Zugriff auf sensible Dateien zu verhindern. Verwende realpath() und prüfe, ob der aufgelöste Pfad innerhalb des erwarteten Verzeichnisses liegt.

Rückgabewert prüfen: Im Fehlerfall gibt die Funktion false zurück, erzeugt aber zusätzlich eine E_WARNING-Meldung. Der Hash-Kontext bleibt in diesem Fall unverändert. Fehlgeschlagene Aufrufe sollten immer explizit behandelt werden.

HMAC-Unterstützung: hash_update_file() funktioniert auch mit HMAC-Kontexten, die per hash_init('sha256', HASH_HMAC, $key) erstellt wurden – ideal für signierte Prüfsummen.

Große Dateien: Da die Datei intern in Blöcken gelesen wird, ist die Funktion auch für sehr große Dateien geeignet, ohne den PHP-Speicher zu überlasten.