Download per PHP

Hallo PHP-Experten,

ich biete auf einer Website Downloads (PDF direkt öffnen, RAR- und ZIP-Archive herunterladen) für registrierte Benutzer an. Nun möchte ich Hotlinking verhindern. Mit der .htaccess (Referrer Check) hat das auch im Großen und Ganzen funktioniert. Leider konnten aber einige PDF-Dokumente auch nach „Ziel speichern unter“ nicht geöffnet werden. Es erschien eine Fehlermeldung vom Adobe Reader ("… beginnt nicht mit %PDF" oder ähnlich). Nach Entfernen des Referrer-Checks war alles wieder in Ordnung. Also muss ich mir wohl eine Alternative überlegen.

Lange Rede, kurzer Sinn: Wie kann ich mit einem PHP-Script den Download einer Datei realisieren, ohne dass der Downloader den URI der Datei erfährt? So könnte ich den Referrer und die Login-Daten per PHP prüfen und ggf. den Download blockieren. Links zu einfachen Beschreibungen sind auch willkommen. Google hat mich da leider nicht wirklich weiter gebracht.

Schönen Gruß
HB

Hallo,

am einfachsten geht das wohl mit einem Aufruf eines Scriptes.
Unten hab’ ich eine Funktion angehängt die ich benutze.
Funktion ist ganz einfach. Du rufst die Downloadseite auf und übergibst eine Identifikation der Datei (im einfachsten Fall den Dateinamen als Base64). Mit der Funktion web_push_file lieferst Du bei richtigem Aufruf die Datei zurück ansonsten eine Fehlemeldung oder ähnliches.
Achtung : die Funktion benutzt einige Bibliotheken aus meinem Framework, aber der Hintergrund sollte klar werden.

function web\_push\_file($filepath,$name=FALSE,$maxspeed=50,$encrypted=FALSE)
 {
 $result=FALSE;
 require\_once(DIR\_CLASS."lib.mime.php");

 //Wenn kein Name übergebn wurde, den Dateinamen nehmen
 if ($name==FALSE) $name=string\_extractfilename($filepath);
 $name=str\_replace(" ","\_",$name);

 //Prüfen, ob es ihn gibt
 if (file\_exists($filepath))
 {
 //Unseren Header schicken
 header("Content-Description: File Transfer",TRUE);
 header("Content-Type: ".mime\_get\_type($name),TRUE);
 header("Content-Length: ".filesize($filepath),TRUE);
 header("Content-Transfer-Encoding: binary",TRUE);
 header("Content-Disposition: attachment; filename=".$name,TRUE);

 //Speed gewählt ?
 if ($maxspeed0)
 {
 sleep(1);
 }
 $out = fread($fp, $size);

 //Verschlüsselung beachten
 if ($encrypted)
 {
 $out=crypt\_decode($out);
 }

 print ($out);
 flush();
 }
 $result=TRUE;
 }
 }
 return($result);
 }

ich hoffe das hilft etwas weiter
SvenOfNine

http://www.Sven-of-Nine.de

p.s. Der Download auf meiner Homepage benutzt diese Funktion.

Etwas hab’ ich noch vergessen. Da die Downloadfunktion die Header manipuliert darf vorher kein Zeichen gesendet werden. Das bezieht sich auch auf Leerzeichen oder Returns hinter einem

Ciao
SvenOfNine