phpbar.de logo

Mailinglisten-Archive

[php] Sicherheitsfrage: Files mit PHP vor download schützen

[php] Sicherheitsfrage: Files mit PHP vor download schützen

Tobias Krais krais at bats.ch
Mit Sep 22 10:45:43 CEST 2004


Hallo Andreas,

deinen Vorschlag finde ich eine gute Idee. Ich muss mal mit meinem
Provider srpechen, damit ich Files ausserhalb des Document Root stellen
kann.

Vielen Dank für den Tipp!

Grüssle, Tobias

Am Mi, den 22.09.2004 schrieb Andreas Demmer um 9:51:
> Tobias wrote:
> 
> >> Was, wenn jemand die Position des Files genau kennt und diese in die
> >> Adressleiste des Browsers eingibt. Dann bringen mir die bisherigen
> >> Lösungen ja nichts, oder täusche ich mich.
> 
> Anbei meine Lösung. Die Dateien liegen nicht im verlinkten Verzeichnis media
> (/media/1a2b3c4d5e.jpg) sondern in einem Verzeichnis ausserhalb des
> Webroots.
> Im Rootverzeichnis liegt eine .htaccess, die alle Zugriffe auf das virtuelle
> Verzeichnis /media/, welches nicht existiert, auf eine Datei "media"
> umleitet
> und die mit PHP parst:
> 
> <Files media>
>   ForceType application/x-httpd-php
> </Files>
> 
> In der media prüfe ich nun, ob der Benutzer wirklich von meiner Seite kommt
> (in Deinem Falle ob er eingeloggt ist) und liefere die Datei aus. Zusätzlich
> hole ich noch einige Infos (echten Dateinamen etc.) aus der Datenbank, aber
> auch das könnte man kürzen. Falls der Benutzer nicht eingloggt ist wird ein
> deny.png ausgeliefert. In diesem kann man dem Leecher freundlich darauf hin-
> weisen, dass er einloggt sein muss (in meinem Fall dass er nicht von meiner
> Domain kam).
> 
> <?php
> /**
> * midgetCMS Medien-Feeder 1.2.0
> *
> * liefert die von der URL angeforderten Medien aus,
> * sofern die Anforderung von der eigenen Domain kam
> *
> * @author Andreas Demmer <mail at andreas-demmer.de>
> */
> include_once($_SERVER['DOCUMENT_ROOT'].'/includes/config.inc.php');
> include_once(PATH_INCLUDES.'functions.inc.php');
> require_once(PATH_INCLUDES.'class_visitor.inc.php');
> require_once(PATH_INCLUDES.'class_database.inc.php');
> require_once(PATH_INCLUDES.'class_debugconsole.inc.php');
> 
> $__debugConsole_enable = FALSE;
> @session_start();
> 
> // Besucherzugriff protokolliert? Wenn ja: Medien freischalten
> $visitor = new visitor($_SERVER['REMOTE_ADDR']);
> 
> if($visitor->isRegistered()) {
>     $params = explode('/', $_SERVER['REQUEST_URI']);
>     $filename = array_pop($params);
> 
>     if(strpos($filename, '?')) {
>         $filename = substr($filename, 0, strpos($filename, '?'));
>     }
> } else {
>     $filename = 'deny.png';
> }
> 
> $suffix = substr($filename, strrpos($filename, '.') + 1);
> $filepath = PATH_UPLOADS.$filename;
> 
> if(!file_exists($filepath)) {
>     die('ERROR 404: file "'.$filename.'" not found!');
> }
> 
> // vorgegebenen Dateinamen ermitteln
> $db = new Database();
> 
> $sql = 'SELECT title
>           FROM '.DB_TABLE_MEDIA.'
>          WHERE filename = \''.$filename.'\'';
> 
> $result = $db->query($sql);
> $result = $db->fetchAssoc($result);
> $title = urlencode($result['title']);
> 
> $virtualFilename = $title.'.'.$suffix;
> header('Content-Disposition: filename='.$virtualFilename);
> 
> // Ausgabe der Medien-Datei mit korrektem Header
> if(preg_match('|^jpe*g$|i', $suffix)) {
>     // JPG Bild
>     header('Content-type: image/jpeg');
> } elseif(preg_match('|^gif$|i', $suffix)) {
>     // GIF Bild
>     header('Content-type: image/gif');
> } elseif(preg_match('|^png$|i', $suffix)) {
>     // PNG Bild
>     header('Content-type: image/png');
> } elseif(preg_match('|^pdf$|i', $suffix)) {
>     // PDF Dokument
>     header('Content-Type: application/pdf');
> } else {
>     // unbekannter Medientyp
>     header('Content-Type: application/octlet-stream');
> }
> 
> readfile($filepath);
> exit;
> ?>
> 
> So könnt Ihr es ausprobieren: Ruft folgende URL auf:
> http://www.andreas-demmer.de/media/a9583cc6d1.png
> 
> Eine Zugriffsverletzung sollte erscheinen. Besucht
> http://www.andreas-demmer.de und ruft den Pfad
> http://www.andreas-demmer.de/media/a9583cc6d1.png
> erneut auf, diesmal sollte es gehen.
> 
> Gruss,
> Andreas
> 
> --
> http://www.andreas-demmer.de
-- 
Tobias Krais
Infos zu Technikfolgen im Bereich Bio- und Gentechnik: http://www.bats.ch


php::bar PHP Wiki   -   Listenarchive