| 
 
 
 
 
  
 
 
	
	
    	:: Anbieterverzeichnis ::Globale BranchenInformieren Sie sich über ausgewählte 
                        Unternehmen im 
                        Anbieterverzeichnis von SELFPHP    
 
 
	
	
    	:: SELFPHP Forum ::Fragen rund um die Themen PHP? In über 
                        120.000 Beiträgen finden Sie sicher die passende 
                        Antwort!   
	
	
    	 :: Newsletter ::Abonnieren Sie hier den kostenlosen 
                        SELFPHP Newsletter!
 
 
	
	
    	:: Qozido ::Die Bilderverwaltung mit Logbuch für 
                        Taucher und Schnorchler.    | 
    
      |  | 
        
          | Unterbinden Sie unerlaubte Downloads von fremden Seiten  |  
 
 
          
            | 
 
 Beispielaufgabe
 
 Die nachfolgende PHP5 Klasse unterbindet den direkten Download von Dateien und Bilder von Ihrem Server. Sie können bei der Konfigurationseinstellung angeben, welche externe Seiten (z.B. Partnerseiten) dennoch Ihre Dateien und Bilder direkt von Ihrem Server laden dürfen. Versucht eine nicht autorisierte Seite z.B. eine Datei direkt auf Ihrem Server zu verlinken, ermittelt die Klasse dieses und leitet dann die Anfrage auf eine Seite Ihrer Wahl um (z.B. auf Ihre Downloadseite oder einer Fehlerseite).
 
 Sollte die Klasse die Herkunft der Anfrage nicht eindeutig ermitteln können, wird dennoch der Download oder die Anzeige zugelassen, um hier keinen Fehler zu erzeugen. Allerdings ist dieses eher verschwindend gering, da die Klasse die meisten Anfragen ermitteln wird und nur in Ausnahmen die Herkunft nicht heraus findet.
 
 In der Download-Datei finden Sie eine HTML-Datei, die Sie sich hier anschauen können. Kopieren Sie diese Datei auf Ihren Webserver (nicht lokal auf Ihre Festplatte!) und schauen Sie sich den Unterschied an.
 
 Zur Vorgehensweise
 Alle Dateien und Bilder die Sie schützen möchten, müssen Sie in ein Verzeichnis kopieren. In diesem Verzeichnis können Sie dann beliebige Unterverzeichnisse erstellen, um Ordnung in Ihren Dateien zu wahren. Sie können wie gewohnt Ihre Bilder und Dateien in Ihre Webseite einbinden und verknüpfen  (die Bilder und Dateien sollten allerdings im geschützen Verzeichnis liegen). In unserem Beispiel nennen wir unser neues Verzeichnis my_secure_directory. Kopieren Sie dann in dem neuen Verzeichnis die drei Programmdateien für unsere Klasse sowie alle Ihre Verzeichnisse, Bilder und Dateien hinein. Um hier ein wenig Ordnung zu halten bietet es sich an, dass Sie in my_secure_directory noch ein Unterverzeichnis erstellen, indem Sie alle Bilder und Dateien kopieren.
 
 Verzeichnis-Struktur
 
 |-my_secure_directory
 |-.htaccess
 |-downloadManager.php
 |-downloadManager.inc.php
 
 
 .htaccess Datei
 
 Hier müssen Sie nichts verändern und können diese Datei so in das Verzeichnis kopieren. Die .htaccess Datei sorgt lediglich dafür, dass jede Anfrage die in diesem Verzeichnis gestellt wird, an die Datei downloadManager.php geleitet wird.
 
 
 | 
RewriteEngine On
RewriteRule ^.*$ downloadManager.php [NC,L]
 
 | 
 
 
 
 
 downloadManager.php
 
 In dieser Datei müssen Sie nur einige kleine Einstellungen vornehmen, wie z.B. die erlaubten Seiten eintragen oder die möglichen Weiterleitungs- oder Fehlerseiten definieren.
 
 
 | 
<?php
 require_once 'downloadManager.inc.php';
 
 $allowedSites = array ('www.selfphp.de','www.qozido.de');
 
 $allowed = new SELFPHP_Download_Manager( $allowedSites );
 
 if ( $allowed->isValid() ) {
 
 // Download starten
 if ( $allowed->startDownload() == false ){
 // Hier eventuelle Fehler ausgeben, Datei nicht vorhanden oder Weiterleitung.
 header("Location: http://www.selfphp.de/de/extras/download.php");
 }
 
 exit;
 
 }
 else {
 
 // Weiterleiten auf Downloadseite
 header("Location: http://www.selfphp.de/de/extras/download.php");
 
 exit;
 
 }
 
 ?>
 
 | 
 
 
 
 
 downloadManager.inc.php
 
 Hier sehen Sie noch die vollständige Klasse für den Download-Manager. In dieser Datei müssen Sie nichts ändern.
 
 
 | 
<?php
/**
 * downloadManager (SELFPHP downloadManager Class)
 *
 * Blockt alle Downloads die über fremde Seiten aufgerufen werden
 *
 * @package SELFPHP_Download_Manager
 * @author SELFPHP OHG
 * @copyright 2009, SELFPHP OHG
 * @license BSD License
 * @version 1.0.0
 * @link http://www.selfphp.de
 *
 */
 
 class SELFPHP_Download_Manager {
 
 /**
 * @var array Erlaubte Webseiten
 */
 private $allowedSites         = array();
 
 /**
 * @var string Die angeforderte Datei
 */
 private $requestUri = '';
 
 /**
 * @var array Content-Types
 */
 private $contenTypes = array();
 
 /**
 * @var array Content-Type Key
 */
 private $contenTypeKey = 'default';
 
 
 /*
 * Constructor
 *
 * @param    array    $sites    Erlaubte Webseiten
 */
 public function __construct($sites) {
 
 $this->allowedSites = $sites;
 
 $this->contenTypes = array('gif'  => 'image/gif',
 'jpg'  => 'image/jpeg',
 'jpeg' => 'image/jpeg',
 'jpe'  => 'image/jpeg',
 'bmp'  => 'image/bmp',
 'png'  => 'image/png',
 'tif'  => 'image/tiff',
 'tiff' => 'image/tiff',
 'swf'  => 'application/x-shockwave-flash',
 'default'  => 'application/octet-stream');
 
 $this->setFileName();
 
 }
 
 /**
 * Überprüft ob der Wert leer ist
 *
 * @param    string    $value        Der Wert
 *
 * @return    string                True im Erfolgsfall, false im Fehlerfall
 */
 private function isEmpty( $value = NULL ){
 
 if (is_string($value) && (('' === $value) || preg_match('/^\s+$/s', $value))) {
 return false;
 } elseif (!is_string($value) && empty($value)) {
 return false;
 }
 
 return true;
 
 }
 
 /**
 * URL in Bestandteile zerlegen
 *
 * @param    string    $url        Die zu zerlegende URL
 *
 * @return    string                Der Host
 */
 private function parseUrl ( $url ){
 
 $array = parse_url($url);
 
 return $array['host'];
 
 }
 
 /**
 * Überprüft ob der Referer in den erlaubten Webseiten steht.
 * Wird kein Referer übergeben (manche Browser setzen ihn nicht),
 * so wird der Download dennoch gestartet.
 *
 * @return    boolean                True im Erfolgsfall, false im Fehlerfall
 */
 public function isValid() {
 
 $referer = $_SERVER['HTTP_REFERER'];
 
 if ( $this->isEmpty( $referer ) == true ) {
 
 $url = $this->parseUrl( $referer );
 
 if ( in_array( $url, $this->allowedSites ) )
 return true;
 else
 return false;
 
 }
 
 return true;
 
 }
 
 /**
 * Erstellt den Pfad für die angeforderte Datei
 *
 * @return    boolean                True im Erfolgsfall, false im Fehlerfall
 */
 private function setFileName(){
 
 if ( $_SERVER['REQUEST_URI'] ) {
 $this->requestUri = $_SERVER['REQUEST_URI'];
 }
 elseif ( @$_SERVER['HTTP_X_REWRITE_URL'] ) {
 $this->requestUri = $_SERVER['HTTP_X_REWRITE_URL'];
 }
 else {
 $this->requestUri = $_SERVER['ORIG_PATH_INFO'];
 }
 
 
 if (substr(PHP_OS, 0, 3) === 'WIN') {
 $this->requestUri = str_replace('\\', '/', $this->requestUri);
 }
 
 $this->requestUri = $_SERVER['DOCUMENT_ROOT'] . $this->requestUri;
 
 return true;
 
 }
 
 /**
 * Sucht nach dem passenden Content-Type
 *
 * @return    string    Der Content-Type
 */
 private function getFileTyp(){
 
 $path_parts = pathinfo( $this->requestUri );
 
 $ext = strtolower( $path_parts["extension"] );
 
 if ( array_key_exists( $ext, $this->contenTypes ) ){
 $this->contenTypeKey = $ext;
 return $this->contenTypes[$ext];
 }
 else{
 $this->contenTypeKey = 'default';
 return $this->contenTypes['default'];
 }
 
 }
 
 /**
 * Fügt einen neuen User der htpasswd-Datei hinzu
 *
 * @param    string    $file            Die Datei für den Download
 * @param    string    $contentType    Der Content-Type der Datei
 *
 * @return    boolean                True im Erfolgsfall, false im Fehlerfall
 */
 public function startDownload( ) {
 
 if ( !file_exists( $this->requestUri ) )
 return false;
 
 if ( $this->contenTypeKey == 'default' ){
 header("Pragma: public");
 header("Expires: 0");
 header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
 header("Cache-Control: private",false);
 header('Content-Disposition: attachment; filename="' . basename($this->requestUri) .'"');
 header("Content-Transfer-Encoding: binary");
 header("Content-Length: ".filesize( $this->requestUri ));
 }
 
 header("Content-type: " . $this->getFileTyp());
 
 readfile( $this->requestUri );
 
 return true;
 
 }
 
 }
 
 ?>
 
 | 
 
 
 
 
 Download
 download-manager.zip
 
 
 
 
  
 
 
 |  
            |  |  |  |  
 
 
 |  
 
  
 
 
 |