Frage zur PHP Fileupload Sicherheit
-
Ich bastel mir gerade ein kleines Script um über PHP Dateien auf einen Server hochladen zu können.
Ich bin gerade dabei eine Funktion zu basteln welche es dem Benutzer erlaubt nur Dateien mit einer bestimmten Endung hochzuladen.PHP Dateien sollte der Benutzer natürlich auf keinen Fall hochladen können.
jpg,png,bmp,exe ist ja alles okay.Aber welche Dateiendungen sollte ich noch vermeiden außer .php ?
Wie sieht es aus mit bin,txt,doc ?Da kann doch eigentlich nichts passieren oder liege ich da falsch?
<?php $t_path = "folder/"; $t_path = $t_path . basename( $_FILES['upf']['name']); if(move_uploaded_file($_FILES['upf']['tmp_name'], $t_path)) { $uploadedfile = $upf. basename( $_FILES['upf']['name']); echo "ok :D"; } else { echo "Fehler :( "; } ?>
-
Ich würde dir raten sowieso den Dateinamen und die Endung zu entfernen und die Datei garnicht erst per direktem Aufruf verfügbar machen.
Ansonsten geht es im Prinzip darum, dass der Webserver die Endung nicht mit einem speziellen Handler associiert hat. zB eben PHP, CGI,...
-
Was meinst du hiermit genau?
Shade Of Mine schrieb:
Ansonsten geht es im Prinzip darum, dass der Webserver die Endung nicht mit einem speziellen Handler associiert.
Was für ein Handler?
-
upload schrieb:
Was meinst du hiermit genau?
Shade Of Mine schrieb:
Ansonsten geht es im Prinzip darum, dass der Webserver die Endung nicht mit einem speziellen Handler associiert.
Was für ein Handler?
zB PHP
Der Webserver associierte ja .php Dateien mit dem PHP Interpreter.
Wenn du nun Dateien hochlädst die der Server mit einem Interpreter associiert, dann hast du ein Sicherheitsproblem. Da der Uploader dann ja beliebigen Code auf dem Server ausführen kann.
-
Aber wenn ich z.b. eine Textdatei oder eine jpg Datei hochlade und da PHPCode reinschreibe und die Datei dann z.b. so aufrufe: http://localhost/file.jpg
Dann kommt halt nur eine Fehlermeldung das die Grafik nicht angezeigt werden kann.
Daher versteh ich jetzt irgendwie nicht wie da jemand Code ausführen kann ...Die Bilddatei und Textdateien scheint der Server ja dann nicht zu assozieren.
-
Ne natürlich nicht.
Wenn am Server die Datei keine .php* Endung hat, sollte es auch nie zu einer Ausführung kommen.
-
Ich würde dir raten sowieso den Dateinamen und die Endung zu entfernen und die Datei garnicht erst per direktem Aufruf verfügbar machen.
FTW
-
Grundsätzlich sehe ich kein Problem den User auch .php-Dateien hochladen zu lassen. Bei meinen Anwendungen ist es so, dass die hochgeladenen Dateien nicht direkt von außen erreichbar sind.
Ausgeliefert werden die Dateien dann auch über PHP (je nach Performance und Anwendungsfall). z.B. via http://mydomain/getfile/?id=1234
// ganz vereinfacht echo file_get_contents( $pathToFile );
Dadurch kommt der PHP-Parser kommt damit nie mit den hochgeladenen Dateien in Berührung. Außerdem kann ich so spezielle HTTP-Header (z.B. Cache) setzen, Berechtigungen abfragen bevor die Datei ausgeliefert wird.