Frank Dell: Datei - Upload / Sicherheit?

Hallo,

seiner einiger Zeit bin ich damit beschäftigt, eine web-basierte Bilddatenbank zu erstellen (PHP & MySqL). Der berechtigte Personenkreis (ca. 100) hat hier die Möglichkeit Bilder in verschiedenen Formaten (PhotoShop, Quark, Freehand usw.) herunterzuladen (download) und auch selbst in das System einzupflegen (upload).

Alles funktioniert mittlerweile wunderbar;-)

Es bestehen aber noch Fragen hinsichtlich der Sicherheit. Wie kann z.B. Sichergestellt werden, daß nur Grafiken bestimmter Formate upgeloadet werden. Und wie kann sichergestellt werden, daß z.b. eine EXE-Datei nicht als TIFF-Datei getarnt wird?

Mein Gedanke ist jetzt, für den upload nur noch "zip"-Dateien zuzulassen. Meiner Erkenntnis nach, kann der Server entsprechende ZIP-Dateien eindeutig erkennen, d.h. eine EXE-Datei als ZIP-Datei zu tarnen ist nicht möglich. Liege ich da richtig?

Wie sehr Ihr das. Für Anregungen zu Sicherheit bin ich dankbar.

Viele Grüße
Frank Dell

  1. Moin!

    Es bestehen aber noch Fragen hinsichtlich der Sicherheit. Wie kann z.B. Sichergestellt werden, daß nur Grafiken bestimmter Formate upgeloadet werden. Und wie kann sichergestellt werden, daß z.b. eine EXE-Datei nicht als TIFF-Datei getarnt wird?

    Wenn du nur gewisse Grafikformate erlauben willst, dann musst du zwangsläufig nach dem Upload die hochgeladene Datei auf ihren Dateityp prüfen. Bei Bilddaten stelle ich mir das noch recht einfach vor: Wenn ein Bildbearbeitungsskript die Bilddatei nicht öffnen kann, weil die Binärdaten keinem bekannten Format entsprechen, dann ist die Grafik aller Wahrscheinlichkeit nach entweder kein Bild, oder kaputt - in beiden Fällen als Bild unbenutzbar und somit irrtümlich hochgeladen.

    Das Problem: Du brauchst ein Programm, welches mit allen erlaubten Grafiktypen umgehen kann. In PHP gibt es mit getimagesize() eine Funktion, die Bildformate erkennt und die Größe der Bilder in Pixeln ermittelt. Laut http://www.php.net/manual/en/function.getimagesize.php erkennt die Funktion folgende Typen: GIF, JPG, PNG, SWF, SWC, PSD, TIFF, BMP, IFF.

    Wenn du weitere Typen zulassen willst, hast du das Problem, ein passendes Programm zu finden, welches die Datei analysiert und den enthaltenen Bildtyp herausfindet. Ich denke aber, die vorhandene Auswahl an Dateitypen ist schon recht ansprechend und sollte ausreichen.

    Was das Verstecken einer EXE-Datei in einem TIFF-Dateinamen angeht: Das ist eher kein Problem. Du mußt halt dafür sorgen, dass die Binärdaten immer schön als Daten angesehen werden. Wenn du eine EXE-Datei als ".tif" benennst, wird auch unter Windows nach dem Download die Datei nicht als Programm ausgeführt werden - das geschieht erst, nachdem die Datei wieder umbenannt wird in ".exe". Natürlich ist es unsicherer für die Anwender, wenn du die Datentypen der hochgeladenen Dateien nicht prüfst - aber wenn sie die Dateinamen nicht ändern, passiert auch nichts.

    Mein Gedanke ist jetzt, für den upload nur noch "zip"-Dateien zuzulassen. Meiner Erkenntnis nach, kann der Server entsprechende ZIP-Dateien eindeutig erkennen, d.h. eine EXE-Datei als ZIP-Datei zu tarnen ist nicht möglich. Liege ich da richtig?

    Doch, geht auch. Einfach umbenennen, und schon ist sie getarnt.

    ZIP-Dateien selbst sind zwar deshalb von Vorteil, weil sie kleinere Up- und Downloadgrößen bedeuten als einige der oben genannten Dateiformate, aber sie bergen ein Problem: Man kann mehrere Dateien in eine ZIP-Datei packen, du kannst nicht mehr direkt auf den Dateiinhalt zugreifen, um das Format zu checken, sondern musst vorher die Datei entpacken, und man kann ganz leicht eine EXE-Datei zippen, die der unbedarfte Benutzer dann per Doppelklick ganz schnell gestartet hat - du bastelst dir also im Prinzip eine unnötige "Schutzschicht" um deine Grafikdateien, die dort eigentlich nichts zu suchen hat, wenn du den Dateiinhalt prüfen willst. Außerdem gibt es so verrückte Dinge wie selbstentpackende Archive - die ihrerseits ganz harmlose EXE-Dateien sind, die man auch mit WinZIP etc. als Datendatei öffnen könnte, aber die Virusinfektionsgefahr ist dennoch enorm. Sowas willst du bestimmt nicht haben.

    Wie sehr Ihr das. Für Anregungen zu Sicherheit bin ich dankbar.

    Wie erwähnt: Dateityp des Bildes prüfen - wenn der in Ordnung ist, ist es ein Bild, ansonsten Müll. Eventuell hilft dir auch ein Tool wie Image-Magick (Hm, ist das jetzt nur für Perl? Ich glaube nicht.), welches deine Grafiken auch noch ganz prima skaliert, damit du Thumbnails auf eine Übersichtsseite packen kannst - damit sieht man dann auch ohne Prüfung der Datentypen anhand des Thumbnails (sofern ImageMagick damit zurecht kommt), dass die angebliche Bilddatei eher nur Müll enthält.

    - Sven Rautenberg

  2. Hi,

    Es bestehen aber noch Fragen hinsichtlich der Sicherheit. Wie kann z.B. Sichergestellt werden, daß nur Grafiken bestimmter Formate upgeloadet werden. Und wie kann sichergestellt werden, daß z.b. eine EXE-Datei nicht als TIFF-Datei getarnt wird?

    ich überprüfe immer ob :
    die Grafik die richtige Endung hat (.jpg, gif,...)
    die Grafik keine Textdatei ist.
    die Grafik nicht größer als 512k ist.

    Mein Gedanke ist jetzt, für den upload nur noch "zip"-Dateien zuzulassen. Meiner Erkenntnis nach, kann der Server entsprechende ZIP-Dateien eindeutig erkennen, d.h. eine EXE-Datei als ZIP-Datei zu tarnen ist nicht möglich. Liege ich da richtig?

    hmmm keine Ahnung.

    $xNeTworKx.