Im Allgemeinen ist es keine gute Idee, geschützte Dateien im Stammverzeichnis des Dokuments bereitzustellen. Insbesondere, wenn Benutzer sich anmelden müssen, um sie zu sehen/darauf zuzugreifen. Wenn Sie die Bereitstellung an den Webserver delegieren, verlieren Sie die Möglichkeit, programmgesteuert zu überprüfen, ob der Benutzer angemeldet ist, da der Apache-Webserver nicht erkennen kann, ob ein Benutzer in Ihrer PHP-Anwendung authentifiziert ist. Sobald ein Benutzer die Datei-URL kennt, kann er auf die Datei zugreifen, ohne sich am System anmelden zu müssen.
Es gibt eine Problemumgehung, die ich durch dich bekommen werde. Ich empfehle Ihnen jedoch dringend, die Dateien außerhalb Ihrer Webroot zu platzieren und ein Skript zu entwickeln, um sie beim Zugriff zu übermitteln. Auf diese Weise können Sie beim Versenden der Datei nach einer authentifizierten und autorisierten Sitzung suchen.
Wenn Sie jedoch darauf bestehen, diesen Weg zu gehen, gibt es einen Workaround. Lassen Sie uns lag eine Probe Verzeichnisstruktur aus:
/path/to/web/document/root
├── manual
│ └── .htaccess
│ └── file1.pdf # protected
│ └── file2.pdf # protected
│ └── file3.epub # protected
├── documentation.php
├── listing.php # protected
└── .htaccess
Sie die Dateien zu schützen und nur den Zugriff im manual/
Verzeichnis soll, wenn Benutzer angemeldet sind. Also, legen Sie die Richtlinien unten in Ihrer manual/.htaccess
Datei:
RewriteEngine on
RewriteRule^/documentation.php [R]
# Your own rewrite rule has a syntax error and
# causes a 500 internal error
Dies wird umleiten alle Anforderungen an die documentation.php
Datei in dem übergeordneten Verzeichnis. Löschen Sie das Flag R
, wenn Sie keine externe Weiterleitung benötigen.
Wie Sie bereits gesagt haben, ist das Problem jetzt, dass jede Anforderung an die Dateien in manual/
in die Dokumentationsdatei umgeleitet wird.
Die Problemumgehung besteht darin, den Header HTTP_REFERER
zu überprüfen und sicherzustellen, dass die Anforderung von der Datei listing.php
stammt.
RewriteEngine on
# Feel free to change example.com with your own domain
RewriteCond %{HTTP_REFERER} !^http://www.example.com/listing.php$
RewriteRule^/documentation.php [R]
Auf diese Weise jede direkte Anfrage an manual/file2.pdf
in einer Umleitung zu documentation.php
führen wird, aber wenn ein Benutzer in listing.php
auf einen Link klickt sie auf die Datei ohne Probleme zugreifen können.
Wenn Sie die referer Zustand allgemeineren finden Sie in diesem Artikel zu machen brauchen:
Referrer Checking with .htaccess
that a user can easily spoof the HTTP_REFERER
header gewarnt und darauf zugreifen somit die Dateien ohne die Notwendigkeit-angemeldet sein. Der einzige echte kugelsichere Weg, dies zu implementieren, ist das, was ich zu Beginn dieses Artikels gesagt habe.
Sie können auch das Verzeichnis manual/
mit basic http Auth schützen. Auf diese Weise müssen Benutzer jedoch eine andere Kombination aus Benutzername und Passwort eingeben, um auf diesen Ordner zuzugreifen.
Und die PHP-Auflistung funktioniert, wenn Sie den htaccess fallen lassen? Ich denke nicht. – sepehr
Ja. Warum hast du das gedacht? –
Weil "opendir" das Verzeichnis öffnet, obwohl der Webserver einen 500 internen Fehler ausgibt. Haben Sie die Fehlerprotokolle überprüft? – sepehr