Start · Sprachen · PHP · Referenz · stream_is_local

stream_is_local

Funktion

Prüft, ob ein gegebener Stream oder eine URL auf einen lokalen Stream verweist.

seit PHP 5.2.4 Kategorie: io

Signatur

stream_is_local(resource|string $stream): bool

Beschreibung

stream_is_local() ermittelt, ob ein Stream oder eine URL als lokal eingestuft wird. Lokale Streams arbeiten direkt mit dem lokalen Dateisystem oder mit speziellen internen Protokollen (z. B. file://), während entfernte Streams über Netzwerkprotokolle wie http:// oder ftp:// kommunizieren.

Die Funktion akzeptiert sowohl eine geöffnete Stream-Ressource als auch einen String mit einer URL oder einem Dateipfad. Anhand des Protokolls bzw. des Stream-Wrappers wird geprüft, ob das zugrundeliegende Protokoll als lokal registriert ist.

Typische Anwendungsfälle sind Sicherheitsprüfungen oder Optimierungen, bei denen das Verhalten je nachdem, ob es sich um eine lokale oder eine entfernte Ressource handelt, unterschiedlich sein soll – etwa um Netzwerkzugriffe zu vermeiden oder um sicherzustellen, dass nur lokale Pfade weiterverarbeitet werden.

Eigene Stream-Wrapper können durch Setzen des Flags STREAM_IS_URL in ihrer Wrapper-Deklaration als nicht-lokal markiert werden. Fehlt dieses Flag, gilt der Wrapper als lokal.

Parameter

Name Typ Default Beschreibung
$stream Pflicht resource|string Eine geöffnete Stream-Ressource oder ein String, der eine URL bzw. einen Dateipfad repräsentiert. Bei einem String wird das Protokoll ausgewertet, um die Lokalität zu bestimmen.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Stream als lokal eingestuft wird, andernfalls false. Bei ungültigen Eingaben wird ebenfalls false zurückgegeben und eine Warnung erzeugt.

Beispiele

Lokalität eines Dateipfads und einer HTTP-URL prüfen

<?php
// Lokaler Dateipfad
$local = '/var/www/html/beispiel.txt';
var_dump(stream_is_local($local)); // true

// HTTP-URL (entfernt)
$remote = 'http://example.com/datei.txt';
var_dump(stream_is_local($remote)); // false

// FTP-URL (entfernt)
$ftp = 'ftp://ftp.example.com/datei.txt';
var_dump(stream_is_local($ftp)); // false
bool(true) bool(false) bool(false)

Lokalität einer geöffneten Stream-Ressource prüfen

<?php
// Lokale Datei öffnen
$handle = fopen(__FILE__, 'r');
if ($handle !== false) {
    if (stream_is_local($handle)) {
        echo "Der Stream ist lokal – kein Netzwerkzugriff nötig.\n";
    } else {
        echo "Der Stream ist entfernt.\n";
    }
    fclose($handle);
}

// HTTP-Stream öffnen (allow_url_fopen muss aktiviert sein)
$remoteHandle = @fopen('http://example.com/', 'r');
if ($remoteHandle !== false) {
    if (!stream_is_local($remoteHandle)) {
        echo "Der Stream ist entfernt – Netzwerkzugriff findet statt.\n";
    }
    fclose($remoteHandle);
}
Der Stream ist lokal – kein Netzwerkzugriff nötig. Der Stream ist entfernt – Netzwerkzugriff findet statt.

Sicherheitsprüfung: Nur lokale Streams erlauben

<?php
function verarbeiteNurLokal(string $pfad): void {
    if (!stream_is_local($pfad)) {
        throw new \InvalidArgumentException(
            "Nur lokale Dateipfade sind erlaubt: $pfad"
        );
    }
    // Sicherer Zugriff auf lokale Ressource
    $inhalt = file_get_contents($pfad);
    echo "Dateiinhalt geladen, Länge: " . strlen($inhalt) . " Bytes\n";
}

try {
    verarbeiteNurLokal('/etc/hostname');
    verarbeiteNurLokal('http://example.com/datei.txt'); // wirft Exception
} catch (\InvalidArgumentException $e) {
    echo "Fehler: " . $e->getMessage() . "\n";
}
Dateiinhalt geladen, Länge: 10 Bytes Fehler: Nur lokale Dateipfade sind erlaubt: http://example.com/datei.txt

// Wichtig · Fallstricke

Sicherheitshinweis: stream_is_local() sollte nicht als alleinige Sicherheitsmaßnahme eingesetzt werden, da eigene Stream-Wrapper als lokal registriert sein können, auch wenn sie auf entfernte Ressourcen zugreifen. Eine Whitelist erlaubter Protokolle oder Pfade ist in sicherheitskritischen Kontexten vorzuziehen.

Der Protokoll-Teil einer URL bestimmt maßgeblich das Ergebnis. Einfache Dateipfade ohne Protokoll (z. B. /var/www/datei.txt oder ./datei.txt) gelten stets als lokal.

Die Funktion sendet eine Warnung (E_WARNING), wenn ein ungültiger Wert übergeben wird, der weder eine Stream-Ressource noch ein String ist.