Start · Sprachen · PHP · Referenz · is_uploaded_file

is_uploaded_file

Funktion

Prüft, ob eine Datei über HTTP-POST hochgeladen wurde und schützt so vor Angriffen durch manipulierte Dateinamen.

seit PHP 4.0.3 Kategorie: io

Signatur

is_uploaded_file(string $filename): bool

Beschreibung

is_uploaded_file() gibt true zurück, wenn die Datei mit dem angegebenen Pfad über den HTTP-POST-Mechanismus auf den Server hochgeladen wurde. Diese Überprüfung ist essenziell für die sichere Verarbeitung von Datei-Uploads, da sie verhindert, dass Angreifer durch manipulierte Dateinamen auf beliebige Dateien des Servers zugreifen können (z. B. /etc/passwd).

PHP verwaltet intern eine Liste aller im aktuellen Request über POST hochgeladenen Dateien. is_uploaded_file() prüft, ob der übergebene Pfad in dieser Liste enthalten ist. Wird eine Datei wie $_FILES['file']['tmp_name'] übergeben, kann so sichergestellt werden, dass es sich wirklich um eine vom Benutzer hochgeladene temporäre Datei handelt.

Die Funktion sollte immer vor dem Verschieben oder Verarbeiten einer hochgeladenen Datei aufgerufen werden. Sie ergänzt move_uploaded_file(), das diese Prüfung intern ebenfalls durchführt. Beide Funktionen zusammen bilden die Grundlage einer sicheren Upload-Verarbeitung.

Beachte: Die Funktion prüft nur, ob der Pfad tatsächlich einer hochgeladenen Datei entspricht. Inhaltliche Prüfungen (Dateityp, Dateigröße, Schadsoftware) müssen separat vorgenommen werden.

Parameter

Name Typ Default Beschreibung
$filename Pflicht string Der Pfad zur zu prüfenden Datei, typischerweise $_FILES['feldname']['tmp_name'].

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Datei über HTTP-POST hochgeladen wurde, andernfalls false.

Beispiele

Einfache Sicherheitsprüfung vor der Upload-Verarbeitung

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['dokument'])) {
    $tmpName = $_FILES['dokument']['tmp_name'];

    if (is_uploaded_file($tmpName)) {
        // Datei ist sicher per POST hochgeladen worden
        $ziel = '/var/www/uploads/' . basename($_FILES['dokument']['name']);
        if (move_uploaded_file($tmpName, $ziel)) {
            echo 'Datei erfolgreich hochgeladen.';
        } else {
            echo 'Fehler beim Verschieben der Datei.';
        }
    } else {
        // Möglicher Angriff: Datei wurde NICHT per POST hochgeladen
        echo 'Sicherheitswarnung: Ungültige Datei!';
    }
}
Datei erfolgreich hochgeladen.

Schutz vor Path-Traversal-Angriffen

<?php
// Angreifer könnte versuchen, einen beliebigen Systempfad zu übergeben:
$manipulierterPfad = '/etc/passwd';

if (is_uploaded_file($manipulierterPfad)) {
    echo 'Datei wird verarbeitet...';
} else {
    // Gibt false zurück, da /etc/passwd NICHT per POST hochgeladen wurde
    echo 'Zugriff verweigert: Keine gültige Upload-Datei.';
}
Zugriff verweigert: Keine gültige Upload-Datei.

// Wichtig · Fallstricke

Sicherheitshinweis: Verlasse dich niemals ausschließlich auf den Dateinamen aus $_FILES['feldname']['name'], da dieser vom Benutzer frei gewählt werden kann. Nutze immer $_FILES['feldname']['tmp_name'] für die Prüfung mit is_uploaded_file().

move_uploaded_file() führt diese Prüfung intern ebenfalls durch. Es ist dennoch empfehlenswert, is_uploaded_file() explizit aufzurufen, um die Intention des Codes klar zu machen und frühzeitig auf Angriffe reagieren zu können.

Achte darauf, dass upload_max_filesize und post_max_size in der php.ini korrekt konfiguriert sind, und überprüfe $_FILES['feldname']['error'] auf Fehler-Codes vor der Verarbeitung.