Sign in to follow this  
TTlong

.htaccess Direkt-Zugriff auf Dateien verbieten

Recommended Posts

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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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 

Share this post


Link to post
Share on other sites
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)

Share this post


Link to post
Share on other sites
So müsste der Direktzugriff verhindert werden (ungetestet):

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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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)

Share this post


Link to post
Share on other sites
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....

Share this post


Link to post
Share on other sites
Dann mach es doch einfach so

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

Mit Mod-Rewrite ist das doch kein Problem

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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]

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this