Home

Dateiuploads mit PHP

Dienstag, 1. Mai 2007 | Autor: Pr0g

Erweitere Kontrolle des Uploads

In vielen Fällen ist es gewollt den Upload des Benutzers auf bestimmte Dateitypen und eine feste maximale Dateigröße zu beschränken. Wie zu Beginn des Artikels erklärt kann man sich auf die interne Überprüfung des Wertes in MAX_FILE_SIZE nicht immer verlassen, daher fügen wir nun eine eigene Größenüberprüfung in das Script ein.

Mit dazu kommt direkt eine Überprüfung des Dateinamens, bzw. der Dateierweiterung, um nur bestimmte Dateien zuzulassen. Das Erlauben von PHP Dateien etwa könnte ein Sicherheitsrisiko darstellen, da so jeder beliebiger Code direkt auf dem Server ausgeführt werden könnte.

Um die bessere Kontrolle in das Script einzubauen müssen die folgenden zwei Zeilen:

    // Versuchen die Datei aus dem Quell- ins Zielverzeichnis zu verschieben
    
if (move_uploaded_file($source_file$target_file)) {

durch diesen Codeblock ersetzt werden:

    // Maximal erlaubte Dateigröße (in Bytes)
    
$max_size 1048576;

    
// Erlaubte Dateierweiterungen
    
$extensions = array('txt''jpg''png''zip');

    
// Erweiterung der Datei ermitteln
    
$file_extension substr(strrchr($_FILES['meine_datei']['name'], '.'), 1);

    
// Dateigröße prüfen
    
if (filesize($_FILES['meine_datei']['tmp_name']) > $max_size) {
      echo 
'Die Dateigröße überschreitet das Maximum von ' $max_size 'Bytes!';

    
// Dateierweiterung prüfen
    
} elseif (!in_array($file_extension$extensions)) {
      echo 
'Die Datei muss vom Typ "' implode(', '$extensions) . '" sein!';

    
// Versuchen die Datei aus dem Quell- ins Zielverzeichnis zu verschieben
    
} elseif (move_uploaded_file($source_file$target_file)) {

Zuerst wird die maximale Dateigröße in der Variable $max_size (in Bytes) gespeichert. Danach alle erlaubten Dateierweiterungen in dem Array $extensions.

Nun wird die Dateierweiterung vom originalen Dateinamen abgeschnitten. Dazu wird das letzte Stück des Dateinamens ab dem Punkt mit Hilfe von strrchr() abgeschnitten. Lautet der Dateiname etwa “test.txt” so wäre dies der Wert “.txt”. Dieser wird dann an die Funktion substr() übergeben, welche nun noch den Punkt am Anfang entfernt. Übrig bleibt die einzelne Dateierweiterung, welche dann in der Variable $file_extension gespeichert wird.

Zum Überprüfen der Dateigröße wird mit der Funktion filesize() die Größe der Datei im tmp-Verzeichnis ausgelesen und mit dem Wert in $max_size verglichen. Sollte der Wert zu hoch sein wird ein Fehler ausgegeben, ansonsten der nächste elseif Zweig ausgeführt.

In diesem wird geprüft ob die in $file_extension gespeicherte Dateierweiterung in dem Array $extension auftaucht. Dies lässt sich recht leicht mit der Funktion in_array() lösen. Sollte die Erweiterung nicht in dem Array auftauchen, so wird erneut eine Fehlermeldung ausgegeben. Hierbei werden alle erlaubten Typen als Hinweis mit der Funktion implode() zu einem String zusammengesetzt, wobei die einzelnen Elemente durch ein Komma getrennt sind.

Sollte die Überprüfung dagegen positiv ausfallen, so wird auch hier wieder der nächste elseif Zweig ausgeführt, welcher die ursprüngliche Funktion zum Verschieben der Datei aufruft.

Damit ist die bessere Kontrolle fertig und das Uploadscript bereit für den Einsatz.

Seiten: 1 2 3 4 5 6 7 8

Tags » , , «

Trackback: Trackback-URL | Feed zum Beitrag: RSS 2.0
Thema: Artikel

Diesen Beitrag kommentieren.

Kommentar abgeben