"; # echo "

Anzeige im Webbrowser: "; # echo "protect('info.pdf')."\">info.pdf

"; # echo "

\"Speichern unter\" Dialog: "; # echo "protect('fragebogen.pdf',1)."\">fragebogen.pdf (download)"; # echo "

"; # ?> # # Beispiel fuer download.php: # download($_REQUEST['file'])) # { # header("HTTP/1.1 301 Moved Permanently"); # header("Location: /"); # header("Connection: close"); # } # ?> # Der ausgegebene 301 macht aus einem veralteten hotlink auf einen download # einen Backlink fuer die Site. ;-) # # Es werden auch noch 2 Ordner benoetigt, in dem einen werden die # aktuellen downloadschluessel abgelegt, benoetigt also Ordnerrechte 777 # Im 2. Ordner liegen die Dateien. Beide Ordner sollten ggf vor direkten # externen Zugriff per .htaccess geschuetzt werden. # class hotlink_protect{ var $datadir = "hotlinkdata"; # Verzeichnis in dem die verlinkten Dateien liegen var $keydir = "hotlinkkey"; # Verzeichnis fuer die jeweils gueltigen Downloadlinks # Die Verzeichnisse sind entweder absolut im Dateisystem anzugeben, # also in der Form "/var/www/projekt/htdocs/verzeichnis" oder relativ zum script # also einfach "verzeichnis" wenn es im gleichen Orner wie das script liegt var $downloadscript = "download.php?file="; # die url des downloadscripts, der aktuell gueltige Schluessel wird einfach angehangen # beim Einsatz von mod_rewrite koennte es z.B. auch so aussehen: "/downloads/", das # wuerde dann downloadsurl's wie /downloads/hisR6Gewk8deWjosb5es ergeben var $h_p_time = 1800; # Mindestgueltigkeit der jeweiligen downloadurl in Sekunden # Maximale Gueltigkeit ist das 2 fache dieses Wertes # ggf. um weitere benoetigte Mimetypen erweitern var $mime=array( 'pdf' => 'application/pdf', 'txt' => 'text/plain', 'htm' => 'text/html', 'html' => 'text/html', 'png' => 'image/png', 'gif' => 'image/gif', 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'doc' => 'application/msword', 'dot' => 'application/msword', 'rar' => 'application/rar', 'zip' => 'application/zip', 'ppt' => 'application/vnd.ms-powerpoint', 'pps' => 'application/vnd.ms-powerpoint', 'xls' => 'application/vnd.ms-excel', 'xlb' => 'application/vnd.ms-excel', 'xlt' => 'application/vnd.ms-excel', 'mpeg' => 'video/mpeg', 'mpg' => 'video/mpeg', 'mpe' => 'video/mpeg', 'wmv' => 'video/x-ms-wmv', 'qt' => 'video/quicktime', 'mov' => 'video/quicktime', 'avi' => 'video/x-msvideo', 'mpga' => 'audio/mpeg', 'mpega' => 'audio/mpeg', 'mp2' => 'audio/mpeg', 'mp3' => 'audio/mpeg', 'm4a' => 'audio/mpeg', 'swf' => 'application/x-shockwave-flash', 'swfl' => 'application/x-shockwave-flash', 'default' => 'unknown' ); function protect($filename, $attachment=false) { if ($this->keydir[0]=="/") { $verzeichnis=$this->keydir; } else { $pathx = dirname($_SERVER[PATH_TRANSLATED])."/"; $verzeichnis=$pathx.$this->keydir; } if ($attachment) {$atach=1;} else {$atach=0;} $match="/^([a-zA-Z0-9]*)_".$atach."_".$filename."$/"; $d = dir($verzeichnis); while (false !== ($entry = $d->read())) { if (preg_match($match, $entry,$keya)) { $zeit=filemtime($verzeichnis."/".$entry); if (($zeit+(2*$this->h_p_time))>time()) { if (($zeit+$this->h_p_time)>time()) { $key=$keya[1]; } } # if else { unlink ($verzeichnis."/".$entry); } # else } # if } # while if (!$key) { $b=true; $a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $d = dir($verzeichnis); while ($b){ $d->rewind; $key=""; for ($x=0;$x<20;$x++){$key.=$a[mt_rand ( 0, strlen($a)-1)];} $match="/^".$key."_.*$/"; $b=false; while (false !== ($entry = $d->read()) && !$b) { if (preg_match($match, $entry)) { $b=true; } # if } # while } # while $keyfile=$verzeichnis."/".$key."_".$atach."_".$filename; touch ($keyfile); } $d->close(); return $this->downloadscript.$key; } # function protect function download($key) { if ($this->keydir[0]=="/") { $verzeichnis=$this->keydir; } else { $pathx = dirname($_SERVER[PATH_TRANSLATED])."/"; $verzeichnis=$pathx.$this->keydir; } if ($this->datadir[0]=="/") { $dataverzeichnis=$this->datadir; } else { $pathx = dirname($_SERVER[PATH_TRANSLATED])."/"; $dataverzeichnis=$pathx.$this->datadir; } $match="/^".$key."_([01])_(.*)$/"; $d = dir($verzeichnis); while (false !== ($entry = $d->read())) { if (preg_match($match, $entry, $daten)) { $zeit=filemtime($verzeichnis."/".$entry); if (($zeit+(2*$this->h_p_time))>time()) { $datei=$dataverzeichnis."/".$daten[2]; if (file_exists($datei)) { $fileext=strtolower(substr(strrchr($daten[2],"."),1)); if ($this->mime[$fileext]) { $mimetype=$this->mime[$fileext]; } else { $mimetype=$this->mime['default']; } header("Content-type: ".$mimetype); if ($daten[1]==1) { header("Content-Disposition: attachment; filename=".$daten[2]); } readfile($datei); return true; } else { unlink ($verzeichnis."/".$entry); return false; } } # if else { unlink ($verzeichnis."/".$entry); } # else } # if } # while return false; } # function download } # class