.htaccess Direkt-Zugriff auf Dateien verbieten

TTlong

Angesehenes Mitglied
Hallo,

ich benötige für ein Projekt folgendes:

Dateien werden vom Nutzer hochgeladen. Beim Hochladen wird für jede Datei ein Verzeichnis erstellt und ein Downloadlink generiert. (Bsp.: domain.tld/ordner/datei.endung.html <= via .htaccess ne schöne URL gemacht xD)

Der User bekommt, wenn er die Datei über den obigen erzeugten Link aufruft, einen Downloadbutton vorgehalten und kann die Datei dann downloaden.

Problem ist nun, dass er die Datei aber auch direkt über: domain.tld/ordner/datei.endung downloaden kann, das soll er aber nicht dürfen.

Frage:
Wie kann man den direkten Zugriff auf die Datei bzw. den Download verhindern, sodass der User NUR über den obigen ersten Link die Datei downloaden kann?


Gruß TTlong
 
QUOTE (TTlong @ Sa 2.05.2009, 09:26)Problem ist nun, dass er die Datei aber auch direkt über: domain.tld/ordner/datei.endung downloaden kann, das soll er aber nicht dürfen.

Ich nutze zwar .htaccess nicht.

Aber diese Url läßt sich doch einfach auf /ordner/datei.endung.html weiterleiten.

Zumindest nach dem, was ich vom Lesen her weiß, müßte das problemlos gehen.
 
die einfachste Möglichkeit ist mit Mod Rewrite
Einfach die Dateien in einen ganz anderen Ordner legen und den Downloadlink dorthin umleiten, danach wissen deine Besucher schon einmal nicht wo die Dateien wirklich liegen und können sie somit auch nicht direkt laden.

Das ganze kann man dann mit Passwort und Zugriffsberechtigungen noch ausbauen.
 
QUOTE (G.P. @ Sa 2.05.2009, 09:53) Einfach die Dateien in einen ganz anderen Ordner legen und den Downloadlink dorthin umleiten, danach wissen deine Besucher schon einmal nicht wo die Dateien wirklich liegen und können sie somit auch nicht direkt laden.

Das geht (leider) nicht so ohne Weiteres. Die Ordnerstruktur wird exakt so benötigt bzw. vorgeschrieben.

Das mit dem Umleiten ist keine schlechte Idee, jeman ne Idee wies gehen könnte?

Hier meine bisherige Rule:


QUOTE RewriteRule ^ordner/([0-9]+)/(.*)\.html$ /get.php?id=$1&fn=$2
 
hast du einen eigenen server?

sehr performant und dateien sind von außen auch definitiv nicht erreichbar:
applikation -> X-Accel-Redirect -> nginx

noch performanter (das limit ist dann eher die leitung als die leistung des servers):
applikation -> X-Accel-Redirect -> memcached -> nginx

setzt aber einen eigenen server voraus (nginx und memcached installieren) und minimalen programmieraufwand (applikation in memcached schreiben lassen)
 
So müsste der Direktzugriff verhindert werden (ungetestet):

CODE RewriteCond %{THE_REQUEST} /get\.php\?id=[0-9]+&fn=
RewriteCond ^get\.php$ - [F,L]
 
QUOTE (Jörg Kruse @ Mo 4.05.2009, 15:36) So müsste der Direktzugriff verhindert werden (ungetestet):


CODE RewriteCond %{THE_REQUEST} /get\.php\?id=[0-9]+&fn=
RewriteCond ^get\.php$ - [F,L]


Erzeugt leider einen 500'er

Hier mal meine gesamte .htaccess


CODE RewriteEngine on
Options +FollowSymLinks

RewriteRule ^files/([0-9]+)/(.*)\.html$ /get.php?id=$1&fn=$2
RewriteRule ^delete/([^/]+)/?$ /del.php?tk=$1
 
Ja, blöder Fehler vom mir
wink.gif
die zweite Zeile muss natürlich mit einem "RewriteRule" beginnen. Probier's mal so:

CODE RewriteEngine on
Options +FollowSymLinks

RewriteCond %{THE_REQUEST} /get\.php\?id=[0-9]+&fn=
RewriteRule ^get\.php$ - [F,L]

RewriteRule ^files/([0-9]+)/(.*)\.html$ /get.php?id=$1&fn=$2
RewriteRule ^delete/([^/]+)/?$ /del.php?tk=$1
 
Leider nein, der 500'er iss weg, aber der Direktdownload der Datei ist dennoch möglich.
 
Wo befindet sich get.php - im selben Verzeichnis wie die .htaccess?

Ich habe es mal bei mir getestet: wenn ich die URL example.com/get.php?id=1&fn=a aufrufe, erhalte ich eine 403 (wobei .htaccess und get.php im selben Verzeichnis liegen)
 
Dann funktioniert es in der tat, Problem scheint wohl hier eher die Rule zu sein, die den URL umschreibt.

Also aus get.php?id=1&fn=dateiname.endung folgendes macht: domain.tld/ordner/dateiname.endung.html

Lasse ich .html weg, ist die Datei dennoch direkt aufrufbar....
 
Dann mach es doch einfach so

domain.tld/anderer-ordner/dateiname.endung.html

Mit Mod-Rewrite ist das doch kein Problem
 
QUOTE (G.P. @ Mo 4.05.2009, 19:14) Dann mach es doch einfach so

domain.tld/anderer-ordner/dateiname.endung.html

Mit Mod-Rewrite ist das doch kein Problem

Schau mal Post 4, das ist leider nicht möglich.
 
Folgende Möglichkeiten gibt es die Herkunft zu verschleirn:

1. Du schiebst die Dateien in einen anderen Ordner uns leitest den alten Downloadlink dortin um
2. Du erstellst einen anderen Downloadlink und leitest mit mod rewrite zu zu dem alten Platz um.
3. Du änderst den Ort der get.php Datei

zu 1. die sichtbare Ordnerstruktur wird NICHT geändert
zu 2. die tatsächliche Ordnerstruktur wird NICHT geändert
zu 3. die tatsächliche wird NICHT geändert

Wenn du immer in den gleichen Ordner verlinken willst/musst wo die Dateien liegen und dabei auch noch fast den selben Namen verwendest, dann gibt es kaum eine Möglichkeit die Dateien zu schützen.
 
QUOTE Dann funktioniert es in der tat, Problem scheint wohl hier eher die Rule zu sein, die den URL umschreibt.

Also aus get.php?id=1&fn=dateiname.endung folgendes macht: domain.tld/ordner/dateiname.endung.html

Lasse ich .html weg, ist die Datei dennoch direkt aufrufbar....


Ja, da habe ich dich missverstanden - ich dachte, du wolltest die dynamische URL vor dem Zugriff schützen.

Die statische URL ohne .html Endung würde ich so blocken:


CODE RewriteCond %{THE_REQUEST} !files/[0-9]+/.*\.html
RewriteRule ^files/([0-9]+)/(.*)$ - [F,L]
 
Super, das funktioniert!

Lasse beide Rules von dir stehen, da ja schließlich beides nicht möglich sein soll, obwohl es nahezu ausgeschlossen ist, dass jemand den PHP-URL kennt...


DANKE DANKE DANKE
 
Hallo,

am Besten den Ordner komplett sperren ("Deny from all"), und den Download per PHP zur Verfügung stellen mittels readfile() oder temporärerer Htaccess-Benutzerkennung. Wenn ich es noch richtig in Erinnerung habe wird ein Rewritebefehl dann sauber funktionieren, aber die Dateien im Ordner wäre gesperrt.


MfG,
Sascha
 
QUOTE (Sascha Ahlers @ Di 5.05.2009, 12:43) Wenn ich es noch richtig in Erinnerung habe wird ein Rewritebefehl dann sauber funktionieren, aber die Dateien im Ordner wäre gesperrt.


Benutzerkennung via .htaccess scheidet (ebenfalls) aus.

Die Datei wird bereits mittels readfile() an den Client geschickt, mit einem deny from all wird leider der gesamte Zugriff auf diesen Ordner geschützt, zumindest der Ordner "files".

Oder sollte ich den Ordner, der bei jedem Dateiupload erstellt wird mit einer solchen .htaccess schützen?

Reguläre Ordnerstruktur ist Folgende:

domain.tld/files

Beim Upload wird ein Verzeichnis xy erstellt und dorthin die Datei kopiert: domain.tld/files/xy/datei.endung


Gruß TTlong
 
QUOTE (TTlong @ Di 5.05.2009, 14:20) [...] Die Datei wird bereits mittels readfile() an den Client geschickt, mit einem deny from all wird leider der gesamte Zugriff auf diesen Ordner geschützt, zumindest der Ordner "files". [...]

Nun Verstehe ich Dich nicht mehr, ich dachte Du wolltest kontrollieren, wer die Daten herunterladen darf, dazu musst Du doch den Ordner von außen komplett sperren...? Solange es den Webseitenaufruf nicht behintert und soweit ich weiß und den mir vorliegen Informationen, müsste das so gehen, eine .htaccess in der Ordner legen mit "Deny from all". Der Rewrite müsste trotzdem noch funktionieren, da hier auf eine andere Datei zugreifen wird, die nicht in dem Ordner funktioniert. Soweit zumindestens mein Kenntnissstand.

Ansonsten leg die Dateien doch wo anders ab, wenn interessiert es, wie der Pfad nun wirklich lautet, wenn Du die Dateien sowieso mittels PHP zum Runterladen anbietet und readfile() verwendest? Und PHP interessiert es nicht, ob dort nun eine .htaccess mit "Deny from all" drinne liegt oder nicht, das interessiert nur den Webserver, der Fragen von außen blockiert, aber nicht Anfragen, die innerhalb des Systems ablaufen.
 
Zurück
Oben