Teil von  SELFPHP   Teil von  Code Snippets / PHP / HTTP
  +++ SELFPHP CronJob-Service :: Jetzt auch als Professional-Version verfügbar! +++



:: Anbieterverzeichnis ::

Globale Branchen

Informieren 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!

Vorname: 
Name:
E-Mail:
 
 

:: 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_OS03) === '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






 




:: Premium-Partner ::

Webhosting/Serverlösungen


Premium-Partner MECO Systemhaus GmbH & Co. KG
Premium-Partner PSW GROUP GmbH & Co. KG
Premium-Partner BPI-Systeme
Premium-Partner Pixel X
Premium-Partner
 

:: SELFPHP Sponsoren ::


Microsoft Deutschland GmbH
twosteps.net - ...Premium-Webhosting
Sedo - Bei uns wird PHP großgeschrieben
hostfactory.ch - OptimaNet Schweiz AG
ZEND - The PHP Company
Kaspersky Labs
HighText iBusiness
SELFPHP Sponsoren
 

Qozido


© 2001-2009 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt