HTML-Formulare, die mit Hilfe von POST
an den Server übermittelt werden, verfügen über die Möglichkeit, auch Dateien mitsenden zu können. Der Browser erzeugt automatisch ein Dateieingabefeld, wenn er für das input
-Feld die type
-Angabe file
erhält:
1 |
<input name="datei" type="file" size="50"> |
Das gesamte form
muss für das Attribut enctype
den Wert multipart/form-data
erhalten, so dass es versendet werden kann. Solche Dateien können mit Hilfe der superglobalen Variable $_FILES
von dem serverseitigen Skript angenommen werden.
Dafür enthält die superglobale Variable $_FILES
einen Eintrag pro hochgeladener Datei. Für oben genanntes Formular wird sie einen Eintrag datei
enthalten:
$_FILES["datei"]["name"]
: Clientseitiger Dateiname$_FILES["datei"]["type"]
: Clientseitiger Mimetype$_FILES["datei"]["size"]
: Empfangene Dateigröße$_FILES["datei"]["error"]
: Fehlercode$_FILES["datei"]["tmp_name"]
: Name der temporären Datei auf dem Server, in welcher die Inhalte des Uploads zwischengespeichert sind.
Der Upload von Dateien ist ein Einfallstor in einen Webserver. Aus diesem Grunde ist es wichtig, den Upload zu prüfen. Will man direkt mit dem übergebenen Zieldateinamen der $_FILES
-Variablen arbeiten, so ist es unbedingt ein basename()
-Check durchzuführen. Es könnte nämlich sein, dass ein Angreifer in den Dateinamen Pfadinformationen eingebaut hat, die nun dafür sorgen könnten, dass die Datei an einer ganz anderen Position abgelegt wird, als der Entwickler vorgesehen hat und eventuell eine wichtige Datei des PHP-Skriptes überschreiben könnte.
Besser ist es die Spezialfunktionen is_uploaded_file()
oder move_uploaded_file()
zu nutzen:
- Mit
is_uploaded_file()
prüft PHP, ob die als Parameter angegebene Datei tatsächlich hochgeladen worden ist oder ob der Angreifer versucht, auf eine ganz andere Datei zuzugreifen. Als Parameter der Funktionis_uploaded_file()
muss$_FILES["datei"]["tmp_name"]
übergeben werden. - Die Funktion
move_uploaded_file()
verschiebt eine hochgeladene Datei. Der Funktion wird der temporäre Dateiname aus$_FILES["datei"]["tmp_name"]
als erster Parameter übergeben. Als zweiter Parameter wird das Ziel übergeben.
Ein Beispiel für einen einfachen gesicherten Upload:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php // Dateiupload entgegennehmen if (!empty($_FILES)) { if (is_uploaded_file($_FILES["datei"]["tmp_name"])) { $tmp_name = $_FILES["datei"]["tmp_name"]; // Nur basename übernehmen $name = basename($_FILES["datei"]["name"]); move_uploaded_file($tmp_name, "./fileupload/$name"); } } else { // Formular ausgeben ?> <form action="test.php" method="post" enctype="multipart/form-data"> Die Datei: <input type="file" name="datei"> <input type="submit"> </form> <?php } ?> |