theoberlin
Goto Top

Dateien hinter PHP Passwortschutz schützen

Hallo zusammen,

folgende Ausgangssituation:

Ein Link führt zu einem Verzeichnis mit einer Index.php. Dort wird festgestellt, dass eine Session Variable nicht gesetzt ist und man wird zu einem Login geführt. Nach erfolgreichem Login geht es wieder zurück und man bekommt alle Dateien aufgelistet, welche in diesem Verzeichnis liegen.

Nun zum Problem:
Kennt man den Dateinamen, kommt man durch „https://Blabla.blabla/download/blabla/test.txt“

direkt zur Datei ohne das Passwort eingeben zu müssen.

Hat jemand hier einen Lösungsvorschlag außer über ein separates backend zu gehen?

LG
Theo

Content-Key: 502707

Url: https://administrator.de/contentid/502707

Printed on: April 18, 2024 at 05:04 o'clock

Member: erikro
erikro Oct 09, 2019 at 13:54:41 (UTC)
Goto Top
Moin,

das Zauberwort heißt htaccess. Guckst Du hier:
https://wiki.selfhtml.org/wiki/Webserver/htaccess

hth

Erik
Member: theoberlin
theoberlin Oct 09, 2019 updated at 14:12:41 (UTC)
Goto Top
Moin Erik,
habe ich mir schon fast gedacht, bin aber auf keinen grünen Zweig gekommen.

Zugriff Deny für !Localhost geht ja nicht da in der .php auf den Link geklickt wird und Optionen die den direkten Download verhindern sind mir da nicht bekannt. Verzeichnislisting an sich ist natürlich auch abgeschaltet. Kannst du mir ein Stichwort geben?

Edit: Sehe gerade noch woanders:

https://www.askapache.com/htaccess/

Hotlinking/Refferer. Sehe ich mir mal an.

LG
Theo
Member: erikro
erikro Oct 09, 2019 at 14:13:45 (UTC)
Goto Top
Moin,

Zitat von @theoberlin:
Zugriff Deny für !Localhost geht ja nicht da in der .php auf den Link geklickt wird und Optionen die den direkten Download verhindern sind mir da nicht bekannt. Verzeichnislisting an sich ist natürlich auch abgeschaltet. Kannst du mir ein Stichwort geben?

Ich würde die Dateien in ein Unterverzeichnis packen, dann auf der Startseite das Login, der den Zugriff auf das Unterverzeichnis freigibt. Nach dem Login auf die Seite mit dem Listing weiterleiten und gut ist.

hth

Erik
Member: theoberlin
theoberlin Oct 09, 2019 at 14:23:36 (UTC)
Goto Top
Hi,

aber das behebt ja das Porblem nicht, dass wenn man das Unterverzeichnis mit Datei kennt, ohne Login draufkommt oder habe ich da einen Denkfehler?

lg
Theo
Member: erikro
erikro Oct 09, 2019 at 14:27:03 (UTC)
Goto Top
Nein, wenn in dem Unterverzeichnis ein entsprechendes .htaccess liegt, dann bekommst du ohne Authentifizierung einen Error 401. Sonst wäre das ja sinnbefreit. face-wink
Mitglied: 141320
Solution 141320 Oct 09, 2019 updated at 14:35:46 (UTC)
Goto Top
Ich würde den Download nicht über einen direkt erreichbaren Link im Webspace realisieren sondern es folgendermaßen machen.
  • Download-Verzeichnis mit einer generellen .htaccess schützen so das ein direkter Zugriff nicht möglich ist / Alternativ das Download-Verzeichnis außerhalb des Webroots platzieren
  • Dann bei Check der Sessionvariablen dem User den Download per php readfile()-Funktion und passendem Header aus dem Dateisystem des Webservers auslesen und an den Browser ausliefern, so ist kein direkter Link mehr möglich und nötig.

Alternativ kannst du natürlich per htaccess und rewrite jegliche Anfrage an ein Download-Verzeichnis an ein Skript umleiten und dann die Session-Variable checken und die Datei ebenfalls pre readfile() an den Browser ausliefern.

Diese Methoden findest du in diversen fertigen Download-Skripts im Web.
Member: erikro
erikro Oct 09, 2019 at 14:39:41 (UTC)
Goto Top
Moin,

Zitat von @141320:

Ich würde den Download nicht über einen direkt erreichbaren Link im Webspace realisieren sondern es folgendermaßen machen.
  • Download-Verzeichnis mit einer generellen .htaccess schützen so das ein direkter Zugriff nicht möglich ist / Alternativ das Download-Verzeichnis außerhalb des Webroots platzieren
  • Dann bei Check der Sessionvariablen dem User den Download per php readfile()-Funktion und passendem Header aus dem Dateisystem des Webservers auslesen und an den Browser ausliefern, so ist kein direkter Link mehr möglich und nötig.

Alternativ kannst du natürlich per htaccess und rewrite jegliche Anfrage an ein Download-Verzeichnis an ein Skript umleiten und dann die Session-Variable checken und die Datei ebenfalls pre readfile() an den Browser ausliefern.

Diese Methoden findest du in diversen fertigen Download-Skripts im Web.

Sag ich doch. face-wink

Guck mal hier: https://wiki.selfhtml.org/wiki/PHP/Tutorials/Loginsystem

hth

Erik
Member: LordGurke
Solution LordGurke Oct 09, 2019 at 23:45:02 (UTC)
Goto Top
Im großen und ganzen hast du folgende Möglichkeiten:

a) Du verlagerst die zu herunterladenden Dateien in ein eigenes Verzeichnis und unterbindest per .htaccess alle Zugriffe darauf.
Einfach eine Zeile: "Deny from all".
Bonus: Du verschiebst das Verzeichnis irgendwohin außerhalb deines Document-Root, dann kann kommen wer will - es gibt ja keinen direkten Zugriff darauf.
Alle Anfragen auf die Dateien müssen dann aber durch ein PHP-Script durchgeführt werden, was dann entsprechend die korrekten Content-Type:-Header setzen und die Dateien dann mittels readfile() ausliefern muss.
Problematisch ist das aufgrund der max_execution_time, welche bei sehr, sehr langsamen Downloads dann irgendwann abbricht und der Download ebenfalls endet. Hier kannst du eventuell selektiv für dieses Script die max_execution_time abschalten, wenn das zugelassen wird.
Im Falle von PHP-FPM bzw. FCGI springt möglicherweise noch der Webserver aus dem Gebüsch und bricht das Script nach einem Timeout (meist 300 Sekunden) ab.

Dies ist so mit die simpelste und zugleich sicherste Lösung - aber halt mit dem Nachteil der max_execution_time. Wenn du diese abschalten kannst, wäre das die präferierte Lösung.


b) Du setzt mit dem PHP-Script einen Cookie, welcher nur für die aktuelle Session gültig ist und prüfst dann dessen Existenz mittels .htaccess. Eine wirklich Auswertung/Prüfung gegen eine PHP-Session kannst du damit aber nicht machen - lediglich den Cookie und dessen Inhalt statisch vergleichen.
Das lässt sich daher auch clientseitig ausnutzen, indem ein solcher Cookie natürlich auch ohne Login gesetzt werden kann.
Dafür kannst du den Download ohne PHP-Script umsetzen, durch das die Daten durchfließen müssen und du hast keine Gefahr abbrechender Downloads.

Vorteil: Der Download kann so lange dauern wie er eben dauert, ohne die Gefahr abbrechender Downloads - dafür ist der Schutz für geübtes Personal dann aber auch relativ leicht zu umgehen.