Upload Formulare

Upload Formulare

PHP bietet eine einfache Möglichkeit, Dateien auf einen Server zu übertragen. Vertraut man den Usern jedoch zu sehr, können auch hier massive Sicherheitslücken entstehen.

Die interne Verarbeitung von Upload Formularen ist recht simpel. PHP nimmt die hochgeladene Datei entgegen und speichert diese mit einem temporären, zufällig gewählten Namen in einem Verzeichnis, das in der Konfigurationsoption upload_tmp_dir festgelegt wird.

Um nun mit der hochgeladenen Datei arbeiten zu können, kommt das Superglobale Array $_FILES zum Einsatz.

$_FILES['file']
Wobei der Array Schlüssel file der Name des Eingabefeldes ist. Die Informationen über die hochgeladenen Dateien werden in einem assoziativen Array mit folgendem Inhalt gespeichert: Möchte man eine Datei dauerhaft auf dem Server speichern, muss die Datei kopiert bzw. verschoben werden, da die temporäre Datei nach Beenden des Scripts wieder gelöscht wird. Diese Arbeit übernimmt für uns die Funktion move_upload_file().

Beispiel:

<?php

if( move_upload_file($_FILE['file']['tmp_name'],"/ziel/Verzeichnis") ){
     echo 'Die Datei wurde erfolgreich verschoben.';
}else{
     echo 'Die Datei könnte nicht verschoben werden.';
}

?>
move_upload_file() prüft auch zusätzlich, ob die verschobene Datei wirklich die ist die zuvor hochgeladen wurde.

Ein einfacher Schutz gegen Angriffe durch ein Upload Formular ist es der, Datei einen zufälligen Namen und die gewünschte Extension zu geben.

Beispiel:

<?php

$ext = strrchr($_FILE['file']['name'],".");

     if( stristr($ext,'.jpg') ){
         $ext = '.jpg';
     }
     elseif( stristr($ext,'.gif') ){
          $ext = '.gif.';
     }
     else
     {
          die();
     }

$newname = md5(microtime().rand(10000,32000));

move_uploaded_file($_FILES['file']['tmp_name'],'/uploads/.'$newname.$ext);

?>
Die Funktion strrchr(), sucht das letzte vorkommen eines bestimmten Zeichens. In unserem Fall ist das der Punkt. Nun gibt die Funktion darauf folgenden Zeichen zurü,ck. Im Beispiel wird die Funktion genutzt, um die Extension von der hochgeladene Datei und speichern diese, in der Variable $ext.

Die Funktion stristr() such nach einem Teilstring und gibt, im Erfolgsfall ab dem ersten vorkommen eines bestimmten Zeichen zurück, ansonsten erhält man FALSE. Mit Hilfe dieser Funktion, prüfen wir in der If-Anweisung, ob das File die gewünschte Extension hat. Wenn nicht, wird in der elseif Anweisung die nächste erlaubte Extension geprüft usw. Die If Anweisung kann natürlich beliebig erweitert werden. Sollte keine der erlaubten Extensionen vorhanden sein bricht, das Programm die Weiterverarbeitung ab.

Ist die Überprüfung der Extensionen erfolgreich, wird mit md5(), mircotime() und rand() ein zufälliger Name für die hochgeladene Datei generiert und in der Variabel $newname gespeichert.

Zwar können Angreifer so noch PHP-Code auf den Server einschleusen, der Code kann aber nicht mehr ausgeführt werden.

Wenn wir schon mal dabei sind Bilder auf den Server hochzuladen, ist es sinnvoll zu prüfen, ob die hochgeladene Datei auch wirklich ein Bild ist. Dafür kann man die Funktion getimagesize() verwenden. Handelt es sich um ein gültiges Bild, gibt die Funktion ein Array mit Informationen über das Bild zurück. Ansonsten wird der boolsche Wert "FALSE" zurückgegeben.

Beispiel:

<?php

if( getimagesize($_FILES['file']['tmp_name'] ){
    echo 'Die Hochgeladene Datei ist ein Bild;
}else{
     echo 'Die Hochgeladene Datei ist kein Bild';
}

?>