Gustav: Datei auslesen - sicher genug?

Beitrag lesen

Guten Abend,

Gut, ich könnte es auch per PHP-Klasse anhängen, aber das ganze braucht so schon genug Bandbreite.

Das verstehe ich jetzt nicht. Meinst du damit einfach, dass du die Anhänge auch an die Mail anhängen könntest?

ja.
aber da eben nicht jeder ne 50Mbit-LEitung vom Rechenzentrum um die Ecke hat... und mich der Traffic beim senden auch teuer kommt mach ichs eben so ;)

Da ich die Dateien aber ich einem .htaccess-geschützten Admin-Bereich liegen habe und das auch so bleiben soll, habe ich mir kurz ein Extra-Script gemacht, das mir die Datei ausliest, ein header(Content-disposition) und Co. ausgibt und dann die Datei ausliest und an den Browser schickt - der sie auch wie gewollt verarbeitet, funktioniert also.

Du schreibst, die Datei liegt in einem Admin-Bereich? Doch wohl hoffentlich nicht in _dem_ Admin-Bereich, das soll wohl heißen, dass die Anhänge in einem separaten Verzeichnis liegen.

Adminbereich ist auf /admin
Anhänge in /admin/anhänge

Aber: Wenn ja jetzt so ein Witzbold als Dateiname irgendwas.php angibt, kann der sich fröhlich meine Scripte runterladen, und da die Anhänge in /admin/newsletteranhaenge/unixtimestamp_des_sendezeitpunktes/Datei.* liegen, kann er auch ../../index.php oder ../../download.php eingeben und hat dann so - nach ein bisschen Ausprobieren (er weiss ja die Namen der Scripte nicht, aber index etc gibts immer) im schlechtesten fall Zugriff auf den kompletten Rechner bzw. im besten Fall nur Zugriff auf die Dateien, die in meinem Apache-Vhost-Veerzeichnis liegen.

Nein, der Witzbold (welche Adresse hat dein Server nochmal >:->) kann damit die komplette Verzeichnisstruktur auf diesem Server herausbekommen und sich alle Dateien anzeigen lassen, zu denen der Apache-Prozess die Leseberechtigung hat. Ich persönlich würde bei so einem Script z.B. gleich erstmal gib_mir_die_datei.php?datei=/etc/passwd ausprobieren.

tja. und da / nicht geht haste pech gehabt.

wie willst du damit alle datein auslesen?

Deshalb habe ich mal einige Sicherheitsprüfungen eingebaut, dass der User wirklich nur Dateien aus dem Verzeichnis /admin/newsletteranhaenge bekommt und keine .htaccess-Dateien, PHP-Scripte und Co. runterladen kann:

Sehr weise Entscheidung. Aber wie wärs es denn damit: .htaccess erlaubt es dir, AFAIK den Zugriff auf bestimmte Dateien zu verbieten, damit bräuchtest du kein spezielles Script und Auto-Indexing kannst du damit auch abschalten. Abgesehen davon, dass der Apache evtl. die Dateien performanter ausliefert als dein PHP-Script es kann.

Ein ganz schöner Wust ist dass:

$location = "admin/newsletteranhaenge/" . str_replace("/","", str_replace("\","", str_replace(""","",$_GET['id']))) . "/" . str_replace("/","", str_replace("\","", str_replace(""","",$_GET['datei'])));

if (substr($location,24,1) == "." OR strtolower(substr($location,-3,3)) == "php" OR strtolower(substr($location,-2,2)) == "db" OR strstr($location,".htaccess") OR strstr($location,".htpasswd")) // Sicherheitsprüfung, dass er nich aus dem Ordner rauskommt
die("<H2>Fehler!</H2><BR>\nDieser Anhang wurde nicht gefunden!<BR>\n<BR>Bitte überprüfen Sie den Link!$mess_close");

//(...)
?>

Sieht bisher ganz gut aus, nur glaube ich, dass du evtl. zu viel machst. Eigentlich müsste es reichen, Dateien, die mit '/' oder '.' anfangen zu ignorieren, außerdem würde ich aufpassen, ob zufällig "\0" im Dateinamen vorkommt, d.h. ob der QUERY_STRING %00 enthält.
Um die Sache mit den PHP-Dateien zu erschlagen, verweigere den Zugriff auf Dateien, die mit .php enden oder umgekehrt, prüfe gegen eine Attachment-Whitelist.

Hm, dass mit der Whitelist ist eine gute Idee, und dass es zu viele Prüfungen sind habe ich ja geschrieben :)
Aber trotzdem - lieber zu sicher als zu unsicher :)

Keine Ursache, Robert

Gruss und danke, Gustav