Antworten auf deine Fragen:
Neues Thema erstellen

Antworten zum Thema „PHP Sicherheit von Datei-Uploads?“

jimny1999

Nicht mehr ganz neu hier

Hallo,

da die Foreneinträge und die Tutorials zu diesem Thema auf psd-tutorials.de z.T. schon viele Jahre alt sind, erstelle ich ein neues Thema.

Ich habe ein fertiges Upload-Script und mache mir nun ein paar Gedanken zur Absicherung meines Servers. Ich möchte, dass nur bestimmte Dateitypen hochgeladen werden dürfen.

Erster Versuch war natürlich ($_FILES['filename']['type']). Warnende Stimmen auf php.net weisen auf die Unsicherheit dieser Methode hin, weil der so ermittelte Mime-Type vollständig unter der Kontrolle des Absenders ist. Statt dessen solle man finfo_open(FILEINFO_MIME) verwenden, was ich prozedural dann getan habe.

Die durch finfo_open(FILEINFO_MIME) ermittelten Mime-Typen enthalten mehr Details, so dass ich das Ergebnis weiter bearbeiten muss. Allerdings habe ich bemerkt, dass ich z.B. bei einer PHP-Datei (also einer Datei mit der Endung .php und PHP-Code drin), wenn sie mit dem normalen HTML-Doctype beginnt (für HTML 5 z.B. <!doctype html>), als Mime-Type text/html erhalte. Darüber hinaus stimmen die Mime-Typen z.T. auch nicht mit denen aus dem $_FILES-Array überein, was die Angelegenheit verkompliziert.

Daher folgende Frage: Reicht es aus, lediglich die Dateiendung zu prüfen? Oder ist das mit dem Mime-Type essentiell?

Vielen Dank im Voraus für jeden Hinweis!
 

aaarghh

Kann PCs einschalten

Ich habe so was von keine Ahnung von diesem Thema, aber wenn ich die Beschränkung auf bestimmte Dateitypen auf simple Art umgehen wollen würde, dann würde ich einfach vor dem Upload die Dateiendung ändern. Der Downloader bekommt dann einen Hinweis (den man auch im Dateinamen unterbringen kann), dass der Suffix nach dem Download wieder angepasst werden muss.

Was ich nur weiß: "MIME-Sniffing" könnte ein Stichwort sein.
 

tr4ze

Mod | Forum

Teammitglied
PSD Beta Team
Ich habe ein fertiges Upload-Script und mache mir nun ein paar Gedanken zur Absicherung meines Servers. Ich möchte, dass nur bestimmte Dateitypen hochgeladen werden dürfen.

Welche sollen es denn sein.
Bilder(gif/jpg/png) werden z.B. über ImageSize validiert, pdf binär über den Header.
Gibt da ziemlich viele Workarounds für unterschiedlichste extensions.
 

jimny1999

Nicht mehr ganz neu hier

Zum "Mime Sniffing" habe ich einen Artikel von heise ergoogelt, der über eine dadurch geöffnete Sicherheitslücke im Internet Explorer <= Version 7 berichtet. Die Funktion finfo_open(FILEINFO_MIME) macht das Gleiche auf meinem Server, wertet aber nur das erste Doppelbyte der Datei aus, soweit ich weiß. Was erklären würde, warum PHP-Dateien nicht erkannt werden, wenn die Datei mit einem HTML-Tag anfängt. Daraus eine Gefahr für meinen Server zu konstruieren, fällt mir leicht. :-(

Im Moment mache ich das tatsächlich schon so, dass ich dem Dateinamen zusätzlich ein ".upload" am Ende hinzufüge. Das bedeutet, dass ich der Meinung bin, dass die Dateierweiterung wichtig ist, nicht der Mime-Type. Anhand der Konfigurationsdateien meines Servers erscheint mir das logisch, denn Dateien müssen die Endung ".php" haben, um den PHP-Interpreter aufzurufen und sie müssen die Endung ".htaccess" haben, damit der Apache eine Konfiguration annimmt. Andererseits reiße ich dadurch wahrscheinlich eine weitere Lücke auf, wenn ich vorher nicht sicherstelle, dass die Länge des Dateinamens plus zusätzlicher Extension einen bestimmten Wert nicht überschreitet?

Das mit der zusätzlichen Extension ist natürlich auch unkomfortabel für die Nutzer. Bei unverdächtigen Dateien würde ich da gerne drauf verzichten.

Folgende Uploads sollen erlaubt sein:
$endung = array("zip","jpg","gif","png","ppt","pdf");
$erlaubteMimeTypes = array("application/zip","image/jpeg","image/gif","image/png","application/pdf");

Wenn ich nur den Dateinamen behandeln müsste, wäre das fein und nicht so schwer. Ich würde das dann nach dem Submit etwa so machen:

1. Formularfeld nicht leer?
2. $_FILES['size'] > 0? Dann weiter.
3. $filetest = explode (".","Dateiname");
4. strpos($filetest,".") Kein Punkt in $filetest? Kann mir egal sein, also weiter.

Ab hier bin ich mir unsicher:

5. if ($filetest[0] == "") Datei verwerfen, denn da will jemand eine Datei mit einem Punkt am Anfang hochladen
6. count($filetest) um die letzte, die entscheidende Extension zu finden.
7. $filetest[letzte Position] muss im Array erlaubte Dateitypen sein.
8. $_FILES['type'] sollte nix anderes behaupten.

Test fertig, Datei wird ins Upload-Verzeichnis kopiert.

Mit den Dateien wird nichts weiter auf dem Server gemacht, deshalb ist es unwichtig, ob eine Datei mit der Endung .jpg überhaupt Bilddaten enthält. Verhindern will ich das Hochladen von Dateien wie .htaccess, *.sh, *.php usw.

Ach ja, ich habe das leider nicht studiert. Sollte ich vllt. sagen.
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Statistik des Forums

Themen
175.158
Beiträge
2.581.880
Mitglieder
67.226
Neuestes Mitglied
Alec168
Oben