Der Martin: htaccess: Freigabe aus einem bestimmten Ordner

Beitrag lesen

Hallo,

»» »» Und ist diese Methode dann nicht auch von anderen möglich?
»» Wie meinst du das?
Damit war gemeint, wie ich verhinden kann, dass man z.B. durch Einfügen der Zeilen:

{ header("Content-Type: application/octet-stream");   // geeigneten HTTP-Header setzen

readfile("www.exaple.org/dataintern/" . $_GET['file']);


> von einer fremden Seite den Zugriff sperren kann.  
  
wieso von einer \*fremden\* Seite? Wir waren uns doch schon einig, dass der HTTP-Zugriff auf das Verzeichnis /dataintern komplett unterbunden wird.  
  

> Ich habe das Ganze jetzt wie folgt umgesetzt: (Falls mal jemand ein ähnliches Problem hat)  
>   
> ~~~php
  

> <?php  
> session_start();  
> if($_SESSION["loggedin"] == TRUE) {                                                    // wird von meiner auth.php gesetzt  
>   
> 	$allowedDir  = array("dir1","dir2","dir3");		                    // erlaubte Verzeichnisse für den Download	  
> 	  
> 	// erlaubte Dateien für den Download  
> 	$allowedFile = array("file1.pdf","file2.zip","file3.jpg");  
> 	  
> 	if ( isset($_GET['dir']) && isset($_GET['file']) ) {                           // Wurden die Parameter übergeben?  
> 	   $dir = $_GET['dir'];  
> 	   $file = $_GET['file'];  
> 	  
> 	   if ( in_array($dir, $allowedDir) && in_array($file, $allowedFile) ) {       // Sind die Parameter erlaubt?  
> 	      header("Content-Type: application/force-download");                      // geeigneten HTTP-Header setzen  
> 	      header("Content-disposition: attachment; filename=\"".$file."\"");  
> 	      readfile($dir."/".$file);   	             			// Datei durchreichen  
> 	   } else {                                                                    // ungültiger Parameter  
>              echo "Fehler: Zugriff auf angegebene Datei nicht erlaubt.\n";  
>            }  
>         } else {                                                                       // gar kein file-Parameter  
>           echo "Fehler: Kein Dateiname angegeben.\n";  
>         }  
> } else {  
>   echo "Sie sind nicht eingeloggt.\n"  
> }  
> ?> 

Okay. Eins nach dem anderen.

if($_SESSION["loggedin"] == TRUE)

Der explizite Vergleich eines boolschen Wertes mit der Konstanten true ist sinnfrei - ein einfaches 'if ($_SESSION["loggedin"])' erfüllt den gleichen Zweck und ist besser lesbar.

$allowedDir  = array("dir1","dir2","dir3")
$allowedFile = array("file1.pdf","file2.zip","file3.jpg");

Ah, du willst verschiedene Verzeichnisse bedienen. Kann man so machen; ich würde aber die Kombinationen aus Verzeichnis und Dateinamen als Einheit sehen und nicht getrennt abfragen. Bedenke, dass mit deinem Ansatz *jede* Kombination aus Verzeichnis und Dateiname akzeptiert wird - in deinem Beispiel neun verschiedene Kombinationen, die bestimmt nicht alle existieren.

$dir = $_GET['dir'];
   $file = $_GET['file'];

Wozu das Umkopieren?

header("Content-Type: application/force-download");
      header("Content-disposition: attachment; filename="".$file.""");

Das sieht man ab und zu - aber im Gegensatz zu application/force-download, was frei erfunden ist, ist application/octet-stream standardisiert. Die nachfolgende Headerzeile Content-Disposition wäre nur nötig, wenn du einen Content-Type angibst, bei dem ein Browser auf die Idee kommen könnte, ihn selbst darzustellen.

Gute Nacht ebenfalls,
 Martin

--
Success should be measured not so much by the position that one has reached in life,
but by the obstacles one has overcome while trying to succeed.