Dennis: Sicherer Download

Beitrag lesen

Hi Roland,

wenn ich die .htaccess-Datei in den Ordner einfüge, auf welche chmod stell ich diesen Ordner dann?

Die Leserechte müssen so gesetzt sein, dass der PHP Prozess darauf zugreifen kann - mit .htaccess hat das nichts zu tun. Die .htaccess sperrt nur den Zugriff übers Web, mit PHP kannst du alles machen, was du ohne .htaccess vorher auch konntest.

ich glaube dieser Code müsste den Zweck erfüllen (ich hoffe ich hab keine fehler reingeschrieben, aber bei allg. lesezugriff => 777 und keine htaccess-Datei funktionierts

777 ist immer die Hammer-Methode - das solltest du wenn irgendwie möglichk nicht verwenden. Meinst sollte z.B. 660 oder so etwas reichen.

<?PHP

$application = $_GET['application'];
   $dateiname = $_GET['dateiname'];
   header("Content-type: application/$application");
   header("Content-Disposition: attachment; filename=".$dateiname.".".$application."");
   readfile("../files/$dateiname.$application");
?>

  
VORSICHT!! Damit hast du gerade eine ganz tolle Sicherheitslücke geschaffen! Angenommen du hast eine Datei im Documen Root liegen, die Passwort Dateien für z.B. ein MySQL Verbindung oder so etwas beinhaltet, die Datei heißt z.B. config.php.  
  
Jetzt rufe ich dein Script einfach mit ?dateiname=../config&application=php auf und schon bekomme ich den Inhalt der Datei zugeschickt und habe deine Passwörter.  
  
Du musst also vorher zwingend überprüfen, ob die Datei auch im Ordner files liegt und andernfalls den Zugriff verweigern. Das Umwandeln der ../ und ./ ließe sich z.B. prima mit der PHP Funktion [realpath()](http://de3.php.net/manual/en/function.realpath.php) lösen, anschließend noch kontrollieren, ob der Ordner der richtige ist und gut ist - so könnte es z.B. konkret aussehen:  
  
~~~php
$file = $_GET['filename'];  
$path = "/absoluter/pfad/zum/ordner/files/";  
  
if(($filepath = realpath($path . $file)) !== false)  
{  
  if(dirname($filepath) == $path)  
  {  
     // Datei senden  
  }  
}

Von der Idee her sollte das so in etwa gehen - ich weiß nur z.B. grade nicht genau, ob dirname() den Pfad mit abschließendem Slash oder ohne zurück gibt - wenn ohne, dass würde die 2. Bedingung nicht greifen und müsste noch etwas modifiziert werden.

MfG, Dennis.

--
Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
.htpasswd Datei mit PHP erzeugen
"Funktioniert nicht" hat exakt den selben Aussagewert wie "husseldiguggeldu" (Cheatah)