Upload von Dateien via PHP

Datei-Handling

Letzteres kann passieren, wenn der Nutzer auf Hochladen klickt, ohne vorher eine Datei auszuwählen. Den Fehlercode 2 gäbe der Interpreter zurück, wenn die Dateigröße den Wert von MAX_FILE_SIZE überschreiten würde.

In den Zeilen 49 und 50 überprüfen wir schließlich ob die Dateigröße den in $maxsize gespeicherten Wert überschreitet. In allen diesen Fällen gibt das Skript eindeutige Fehlermeldungen aus.

Ausgewählte Dateitypen

Je nach Projekt soll das Skript unterschiedliche Dateitypen akzeptieren. In unserem Beispielprojekt handelt es sich dabei um Grafiken in den web-tauglichen Formaten jpeg, gif und png. Dateien, die es fehlerfrei und in akzeptabler Größe auf den Server geschafft haben, überprüfen wir in den Zeilen 56 bis 64 auf den gewünschten Dateityp und unterbinden in Zeile 66 und 67 den Upload anderer Dateitypen.

Der Dateityp lässt sich allerdings nicht nur durch den vom Browser übermittelten Mime-Type identifizieren, sondern theoretisch auch durch die Namenserweiterung und durch den Inhalt der Datei. Am zuverlässigsten funktioniert aber die hier verwendete Erkennung mittels Mime-Typ. Dieser ist in $uploaded_file['type'] hinterlegt.

Es spricht aber auch kaum etwas dagegen, den Dateityp anhand der Dateiendung zu erkennen. Systeme, die gif-Dateien unter anderen Endungen als .gif speichern, dürften rar gesät sein. Nur bei jpg und jpeg sowie bei Großund Kleinschreibung muss man aufpassen. Wer weitere Mime Media Typen abfragen will, orientiert sich dabei an dem unter tinyurl.com verfügbaren Verzeichnis.

Saubere Dateinamen

In Version 2 haben wir die Datei noch unter dem vom Browser übermittelten Namen abgespeichert. Schon um Angriffe durch problematische Zeichen zu verhindern, muss der Dateiname bereinigt werden.

In Version 3 greift sich unser Skript ab Zeile 69 den Inhalt des name-Elementes aus dem $_FILES-Array. Eventuell enthaltene Pfadangaben werden entfernt. Übrig bleiben nur der Name der Datei und das Suffix. Ersterer wird über eine Regular Expression von allen Zeichen befreit, bei denen es sich nicht um Kleinbuchstaben, Großbuchstaben oder Bindestriche handelt (Zeile 82). Das Suffix wird vom Script anhand des erkannten Mime-Typs neu gesetzt (Zeilen 85 bis 92).

Workshop Datentransfer

© Archiv

Die class_file_upload verfügt über Kommentare im Standard PHPDoc, den IDE wie Netbeans automatisch in Hilfetexte verwandeln.

Anderenfalls könnte ein Angreifer über das Skript eine Datei mit dem Mime-Typ image/jpeg, aber der Dateierweiterung .php schicken. Der Server würde sie mit der Endung .php speichern und beim Aufruf wegen ihrer Endung zur Ausführung an den PHP-Interpreter übergeben.

Fehler beim Speichern der Datei

Auch das Abspeichern der Datei ist in Version 3 vor typischen Fehlern geschützt. Das Upload-Verzeichnis könnte gänzlich fehlen oder es könnte dem Webserver an Schreibrechten dafür mangeln.

Wäre eine Datei gleichen Namens bereits vorhanden, würde das Skript sie überschreiben, was oft unerwünscht ist. Diesen Fällen nehmen sich die Zeilen 87 bis 92 unseres Skriptes an.

87: if(!is_dir($upload_dir)){
88: echo "<h1>Fehler: Upload-
Verzeichnis nicht da</h1>";
89: }elseif(!is_writable($upload_
dir)){
90: echo "<h1>Fehler: Upload-
Verzeichnis nicht beschreibbar</h1>";
91: }elseif(file_exists($upload_dir .
$dateiname)){
92: echo "<h1>Fehler: Datei mit
diesem Namen existiert schon</h1>";

class_file_upload

Mit Version 3 hat das Upload-Skript seinen vollen Funktionsumfang erreicht. Der Code ist aber mit jeder neuen Funktion unübersichtlicher geworden. In Version 4 wurden deshalb projektspezifische und wiederverwendbare Funktionen voneinander getrennt, wobei wir Letztere in eine eigene Klasse ausgelagert haben.

Mehr zum Thema

HTML5: Quick Reference Guide
Ratgeber: "HTML5"

Die wichtigsten Tags auf einen Blick: In unserem praktischen Arbeitsblatt finden Sie einen wertvollen Begleiter für die Umstellung Ihrer Webprojekte…
internet, webdesign, google, content, ranking, seo, suchmaschine
Ratgeber: Urheberrecht

Einzigartige Inhalte bieten Lesern Mehrwert und sind ein wichtiges Qualitätsmerkmal. Ärgerlich, wenn sich jemand durch Kopieren an fremden…
Die besten HTML5-Tipps
Neue Tipps & Tricks für blitz.io

Wer die Leistung einer Applikation ermitteln möchte, braucht keine Skripte zu schreiben, sondern kann einen der zahlreichen Online-Dienste…
image.jpg
Ratgeber: Webentwicklung

Die clientseitige Javascript-Entwicklung bietet fast keine Entwicklungsumgebungen und auch keine vernünftigen Werkzeuge zur Fehlersuche. Eine der…
internet, webdesign, meteor, webapplikationen
Ratgeber

Mit Meteor sollen Entwickler in kurzer Zeit Umgebungen für Webapplikationen erstellen können, ohne sich um lästige Details kümmern zu müssen. Wir…
News
Video
SciFi-Action mit Ryan Gosling und Harrison Ford
Video
Agatha-Christie-Verfilmung mit Johnny Depp