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