is_uploaded_file()
Die Funktion is_uploaded_file() prüft, ob eine Datei per HTTP POST hochgeladen wurde, und gibt true zurück, wenn dies der Fall ist.
Die Funktion is_uploaded_file() prüft, ob eine angegebene Datei über eine HTTP-POST-Anfrage hochgeladen wurde. Sie ist eines der wichtigsten Sicherheitswerkzeuge von PHP für Datei-Uploads: Sie ermöglicht es zu bestätigen, dass ein Pfad wirklich auf eine temporäre Datei zeigt, die PHP selbst aus der aktuellen Anfrage erstellt hat – und nicht auf einen beliebigen Pfad, den ein Angreifer in Ihr Skript eingeschleust haben könnte.
Dieses Kapitel behandelt die Syntax, ein funktionierendes Beispiel, das Sicherheitsproblem, das die Funktion löst, sowie typische Fallstricke.
Syntax
is_uploaded_file(string $filename): bool$filename— der zu prüfende Pfad. In der Praxis ist dies immer ein Wert aus$_FILES['...']['tmp_name'].- Rückgabewert —
true, wenn$filenameeine hochgeladene Datei aus der aktuellen Anfrage ist, andernfallsfalse.
Die Funktion gibt nur true für den temporären Dateinamen zurück, den PHP während des Uploads vergeben hat. Die Übergabe eines selbst erstellten Pfades (z. B. des endgültigen Ziels nach dem Verschieben der Datei) gibt false zurück.
Einfaches Beispiel
<?php
$file = $_FILES['file']['tmp_name'];
if (is_uploaded_file($file)) {
echo 'The file was uploaded via HTTP POST.';
} else {
echo 'The file was NOT uploaded via HTTP POST.';
}Hier ist $_FILES['file'] der Eintrag, der erstellt wird, wenn ein Formularfeld namens file mit enctype="multipart/form-data" übermittelt wird. Der Schlüssel tmp_name enthält den serverseitigen temporären Pfad, und is_uploaded_file() bestätigt, dass dieser wirklich aus der Anfrage stammt.
Warum die Funktion existiert (Sicherheit)
Ohne diese Prüfung könnte ein Angreifer ein normales Formularfeld (keine Datei) übermitteln, dessen Wert ein Serverpfad wie /etc/passwd ist. Wenn Ihr Code diesem String blind vertraut und ihn dann liest oder kopiert, würden Systemdateien exponiert. is_uploaded_file() schützt davor, indem es true nur für Dateien zurückgibt, die PHP selbst als Uploads in der aktuellen Anfrage empfangen hat.
Ein sicherer Upload-Handler validiert die Datei, bevor er damit arbeitet:
<?php
if (
isset($_FILES['file']) &&
$_FILES['file']['error'] === UPLOAD_ERR_OK &&
is_uploaded_file($_FILES['file']['tmp_name'])
) {
$destination = __DIR__ . '/uploads/' . basename($_FILES['file']['name']);
if (move_uploaded_file($_FILES['file']['tmp_name'], $destination)) {
echo 'File stored safely.';
} else {
echo 'Failed to move the uploaded file.';
}
} else {
echo 'No valid upload received.';
}Beachten Sie, dass move_uploaded_file() dieselbe is_uploaded_file()-Prüfung intern durchführt und daher die bevorzugte Methode zum Verschieben von Uploads ist. Verwenden Sie is_uploaded_file() direkt, wenn Sie die temporäre Datei vor dem Verschieben inspizieren oder lesen müssen.
is_uploaded_file() vs. move_uploaded_file()
| Funktion | Was sie tut |
|---|---|
is_uploaded_file() | Gibt einen booleschen Wert zurück, der bestätigt, dass der Pfad ein Upload der aktuellen Anfrage ist. Berührt die Datei nicht. |
move_uploaded_file() | Prüft dasselbe und verschiebt dann die temporäre Datei an ein Ziel. Schlägt fehl (gibt false zurück), wenn die Quelle kein echter Upload ist. |
Häufige Fallstricke
- Immer
tmp_nameübergeben, niemals den endgültigen Pfad. Nachdem Sie eine Datei mitmove_uploaded_file()verschoben haben, existiert die temporäre Datei nicht mehr, sodass eine erneute Prüfungfalsezurückgibt. - Die Prüfung ist anfragespezifisch. Ein Pfad, der in einer vorherigen Anfrage ein Upload war, ist in der aktuellen nicht gültig.
- Es validiert keinen Inhalt.
is_uploaded_file()sagt nichts über Typ oder Größe der Datei aus. Validieren Sie$_FILES['file']['size'], den MIME-Typ und die Erweiterung separat, bevor Sie Benutzerdaten vertrauen. - Prüfen Sie zuerst den Fehlercode. Prüfen Sie
$_FILES['file']['error'] === UPLOAD_ERR_OK, bevor Sieis_uploaded_file()aufrufen; ein fehlgeschlagener Upload kanntmp_nameleer lassen.
Verwandte Funktionen
move_uploaded_file()— eine hochgeladene Datei sicher an ihr Ziel verschieben.$_FILESund andere Superglobale — wie Datei-Upload-Daten Ihrem Skript zugänglich gemacht werden.- PHP File Upload — das vollständige HTML-Formular samt PHP-Handler für die Annahme von Dateien.
Zusammenfassung
is_uploaded_file() gibt true nur für die temporäre Datei zurück, die PHP aus einem HTTP-POST-Upload in der aktuellen Anfrage erstellt hat. In Kombination mit dem Upload-Fehlercode und der Inhaltsvalidierung bildet sie die Grundlage für sicheres Datei-Handling in PHP. In den meisten Fällen lässt man move_uploaded_file() die Prüfung übernehmen und greift nur dann direkt auf is_uploaded_file() zurück, wenn die temporäre Datei vor dem Verschieben gelesen werden muss.