Hallo,
ich habe einen Newsletter, bei dem die Anhänge nicht per Mail, sondern als Link auf einen Webserver mitgeschickt werden soll, d.h. dass am Ende der Nachricht X Links zu den Anhängen (http://bla.de/Datei) stehen, die sich der Empfänger dann runterladen kann.
Gut, ich könnte es auch per PHP-Klasse anhängen, aber das ganze braucht so schon genug Bandbreite.
(Der Newsletter wird btw nur an Empfänger geschickt die sich freiwillig eingetragen haben :))
Soviel zum Hintergrund.
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.
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.
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:
<?php
//(...)
//$_GET['id'] ist der Unix-Timestamp, also der Unterordner in dem die Anhänge liegen
//$_GET['datei'] ist der Dateiname.
$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 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");
//(...)
?>
Nun wollte ich eigentlich nur wissen, ob das so reicht, oder ob euch evtl noch was einfällt, wie man das nun umgehen könnte.
Manche Prüfungen sind eigentlich Sinnfrei, denn wenn er keinen Ordner wechseln kann, bekommt er auch keine *.db-Dateien, aber lieber einen zuviel als zu wenig :)
Danke und Gruss - Gustav.