PHP Download script absichern

Chakky

Member of Honour
Hi,

ich hab eine kurze frage zu einen php script

PHP:
<?php  
$ext = $_GET['ext'];
$id = $_GET['id'];

$pfad = "D:\\xampp\\data\\";
$file = $pfad.$id.".".$ext;
       
header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=\"$id."."$ext\""); 
header('Content-Length: '.filesize( $file )."\r\n"); 
         
readfile($file); 

?>

Das leidet Dateien aus eine nicht für den Browser zugänglichen bereich durch. (Um direkt verlinkungen zu verhindern).

Mir scheint die ganze sache recht unsicher zu sein. Obwohl der $pfad direkt drinne steht, hab ich bedenken das man einfach damit dann jede datei runterladen kann aufn den Server.

Kann mir das jemand bestätigen?

Ich selber hatte gedacht noch ein einer Whitelist um zumindestens die Dateiendungen zu sichern, da hab ich aber das Problem das ich nicht weis welche Dateiendungen jemals alle hochgeladen werden/wurden.


Das Script ist selber durch einen Login gesichert, d.h der Userzugriff umfasst ca 10 potenzielle User (sprich es ist nur einen kleinen Kreis bekannt).

Im Grunde jemand eine Idee wie ich das Script am besten absichern kann, ohne das man damit alle Dateien auf den späteren Webserver auslesen kann?

//Update die ID wird später noch mit "0" aufgefüllt auf 16 Zeichen.

//update 2: mit
download.php?id=.\.\&ext=..\..\..\..\temp\002.jpg konnte ich auf jede beliebige Datei zugreifen wo der Pfand bekannt war
 
Zuletzt bearbeitet:
Ich würde zumindest noch einen Virus-Scan dazwischen schalten, so dass du dir den Server nicht verseuchst, wenn da mal was infiziert ist. Ausserdem sollte man ggf. den Content der Dateien auf Skripte prüfen, die ggf. den Server oder die aufrufenden User gefähren können (PHP-Shell u.ä.).
 
Ich muss zuerst sagen, dass ich absolut keine Ahnung von PHP habe und daher entschuldige ich mich schonmal falls es totaler Blödsinn ist, daher auch eher fragend formuliert, damit ich selber schlauer bin ;).

Ich hab gestern mal zufällig das hier gelesen: Local File Inclusion - Hakipedia
Hat natürlich nichts mit inkludieren hier zu tun, aber würde in dem Script von Chakky, sowas wie "http://blabla.de/download.php?id=/../../meineTollePasswortDatei.txt" funktionieren?

EDIT: Ich glaub ihr diskutiert da gerade schon fleißig in der Shoutbox drüber. Doof wenn man sich erst zum Beitrag schreiben einloggt :D
 
Zuletzt bearbeitet:
@bitmuncher

du meinst beim Upload?



Nach kürzer Diskussion und dank hilfe von xrayn hab ich das script jetzt so geändert:

PHP:
<?php  
$ext = $_GET['ext'];
$id = $_GET['id'];

$pfad = "D:\\xampp\\data\\";
//$file = $pfad.$id.".".$ext;
$file = $pfad.realpath($id.".".$ext);

header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=\"$id."."$ext\""); 
header('Content-Length: '.filesize( $file )."\r\n"); 
         
readfile($file); 

?>

somit ist kein auslesen mehr möglich, muss nur noch ein paar fehler abfangen damit es schön aussieht!

Big THX!
 
Ja, ich meine beim Upload. Sonst kann dir da jemand einfach ein PHP-Skript hochladen und über dieses dann den Server verseuchen. Aber auch ein Check vor dem Download kann durchaus Sinn machen, wenn man sicherstellen will, dass die Dateien nicht auf dem Server manipuliert wurden.
 
Okay, da muss ich mal schauen wie der Upload realisiert wurden ist, war nicht meine Baustelle....

Ich hab den Code von oben nochmal angepasst da irgendwie auch keinen normalen Files durchgekommen sind

PHP:
<?php  
$ext = preg_replace('/[^A-Za-z0-9]+/', '', $_GET['ext']);
$id = preg_replace('/[^A-Za-z0-9]+/', '', $_GET['id']);


$pfad = "D:\\xampp\\data\\";

//$file = $pfad.realpath($id.".".$ext);


$file = $pfad.$id.".".$ext;




if (!@stat($file)) {
    echo 'stat() call failed...';
	exit();
	}
	
	
header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=\"$id."."$ext\""); 
header('Content-Length: '.filesize( $file )."\r\n"); 
         
readfile($file); 



?>

Hab den realpath rausgenommen und filter jetzt die Übergabe nach zeichen Raus die nicht erlaubt sind. Ich hoffe das es so sicherer ist.
 
Zurück
Oben