Dateiupload

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:

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 Funktion is_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:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert