Signatur
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
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!';
}
}
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.';
}
// 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.