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.
- error: Enthält einen Errorcode, wenn ein Fehler beim Upload aufgetreten ist.
- size: Die Größe des Files
- name: Der Name der Hochgeladenen Datei
- tmp_name: temporärer Name.
- Type: Der MIME-Type.
Beispiel:
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.';
}
?>
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:
$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 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:
if( getimagesize($_FILES['file']['tmp_name'] ){
echo 'Die Hochgeladene Datei ist ein Bild;
}else{
echo 'Die Hochgeladene Datei ist kein Bild';
}
?>