Zur Navigation

Zugriff auf Dateien nur über php Script

Deeplinking verhindern

1 Martin_X

Hallo,

ist es möglich den direkten Zugriff auf eine Datei (http://domain.de/dir/file.zip) [Also auch direkteingabe im Browser] zu verhindern, aber über ein php Script zu erlauben, im Script ist ein Link (so wie oben) auf die Datei (also das Script wäre praktisch der Referrer)

Leider waren alle meine Versuche bisher erfolglos :-(

Gruß

Martin

17.06.2008 09:36 | geändert: 17.06.2008 09:53

2 Jörg Kruse

Hallo Martin_X,

du könntest per Modrewite den Referer prüfen - allerdings wird dieser von einigen Firewalls geblockt und kann auch einfach gefälscht werden.

Ansonsten fiel mir als eine etwas aufwendiger Lösung ein, auf ein zweites PHP-Script weiterzuleiten, welches per Modrewrite die Dateiendung .zip erhält und welches z.B. anhand der Session überprüft, ob das erste Script vorher aufgerufen wurde. Im Erfolgsfall wird das eigentliche Zip-File, welches in einem von außen nicht aufrufbaren Verzeichnis liegt, inkludiert und mit passenden HTTP-Headern ausgegeben, andernfalls ein 403 Header. Das wäre dann wohl relativ sicher (aber nicht unbedingt performant)

17.06.2008 10:13

3 Martin_X

Hallo Jörg,

Das mit ModeRewrite und Referer prüfen habe ich schon probiert, leider ohne erfolg. Hättest du dazu evtl. noch ein Beispiel?

17.06.2008 10:23

4 Jörg Kruse

Beispiel-Code für .htaccess im Hauptverzeichnis:

RewriteEngine on

RewriteBase /

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://domain\.de/script\.php$
RewriteRule ^dir/file\.zip$ - [F]

Referer, die nicht leer sind und nicht der URL des Scripts entsprechen, sollten hierbei zu einenm Error 403 führen

17.06.2008 10:34 | geändert: 17.06.2008 10:35

5 Martin_X

Also irgendwo ist da noch der Wurm drin

Options +FollowSymlinks

RewriteEngine on
RewriteBase /

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://domain.de\.de/update/neu/index\.php$
RewriteRule ^Datei\.(zip|rar)$ - [F]

Wenn ich jetzt einen der Folgenden Links teste, dann bekomm ich immer die gewünschte Datei:

http://www.domain.de/update/neu/Datei.rar
http://www.domain.de/update/neu/Ver1/Datei.rar
http://www.domain.de/update/neu/Ver1/222/Datei.rar

17.06.2008 10:53

6 Jörg Kruse

Die Pfade müssen auch noch mit in die Rule rein:
RewriteRule ^update/neu/(.*)Datei\.(zip|rar)$ - [F]

... oder du lässt das erste Begrenzungszeichen "^" weg:
RewriteRule Datei\.(zip|rar)$ - [F]

17.06.2008 11:00

7 Martin_X

Sorry aber das geht beides wieder nicht :( (also es ist wieder ein direkter zugriff auf die datei möglich)

kann es denn sein das ich die .htaccess im falschen Ordner habe? (Momentan ist sie in http://domain.de/update/neu)

17.06.2008 11:20

8 Jörg Kruse

Ich hatte oben ja geschrieben, dass mein Beispiel für eine .htacccess im Hauptverzeichnis gedacht ist ;)

Im Unterverzeichnis musst du RewriteBase und Rule entsprechend anpassen, versuch es mal so:
Options +FollowSymlinks

RewriteEngine on
RewriteBase /update/neu/

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://domain.de\.de/update/neu/index\.php$
RewriteRule (.*)Datei\.(zip|rar)$ - [F]

17.06.2008 11:25

9 Martin_X (Gast)

Also der weg schein schon richtig zu sein, denn jetzt ist es genau verkehrt zu dem was ich brauche: Direkter Zugriff funktioniert, Zugriff von Script aus wird geblockt. Sollte aber genau anders rum sein?!

17.06.2008 11:41

10 Jörg Kruse

Direkter Zugriff funktioniert

Der funktioniert, wenn du die URL direkt in die Adresszeile des Browsers eingibst oder sie aus den Bookmarks aufrufst - da der Browser dann ja keinen Referer sendet. Du kannst diesen Zugriff ohne Referer blocken, wenn du die erste RewriteCond weglässt - allerdings können dann Besucher mit einer Firewall, die alle Referer blockt, grundsätzlich nicht mehr downloaden. Aber dir geht es ja auch mehr um das Blocken von Fremdreferern, wenn ich dich richtig verstanden habe?

Zugriff von Script aus wird geblockt

Rufst du die Seite wirkich von http://domain.de.de/update/neu/index.php ab - oder fehlt das index.php am Ende? Ich würde das Ende hier einfach mal offen lassen:

RewriteCond %{HTTP_REFERER} !^http://domain.de\.de/update/neu/

17.06.2008 11:59