Erlauben Sie nur den Zugriff auf Dateien im Verzeichnis von der Website, zu der sie gehören

Mar 05 2020

Ich weiß, dass es viele ähnliche Fragen gibt, und ich habe sie alle durchforstet, aber ich kann anscheinend keine der Lösungen zum Laufen bringen.

Ich habe einen Ordner im Stammverzeichnis meiner Website mit hochgeladenen Dateien, die angezeigt und von der Website heruntergeladen werden können, wenn ein Benutzer angemeldet ist. Sie befinden sich hier: https://example.com/uploads(zum Beispiel). Ich brauche die Site, um weiterhin auf sie zugreifen zu können, um sie anzuzeigen (einige sind Bilder) und Links zum Herunterladen bereitzustellen (PDFs usw.), damit der Benutzer sie herunterladen kann, aber ich möchte vermeiden, dass jemand die URL von a erhält bestimmte Datei kann sie direkt herunterladen, wie folgt:https://example.com/uploads/2020/02/myfile.pdf. ODER diese URLs gelangen in Suchmaschinen (oder wenn doch, verhindert der Server, dass direkt auf sie zugegriffen wird.

Ich habe versucht, eine .htaccess-Datei im Upload-Verzeichnis mit folgendem Inhalt hinzuzufügen:

Order Deny,Allow
Deny from all
Allow from 127.0.0.1

Und ich habe es versucht

Order Allow,Deny
Deny from all
Allow from 127.0.0.1

... während ich lese, dass HTTPS-Aufrufe von der Site selbst sowie lokale URLs möglich sind.

Aber es verbietet die Seite und eine direkte URL-Anfrage, was nicht gut ist.

Gibt es eine Möglichkeit, dies zu tun?

Antworten

1 MrWhite Mar 06 2020 at 01:25

Die Benutzeroberfläche, die den "offiziellen" Zugriff auf die Dateien ermöglicht, verfügt über eine Benutzerauthentifizierung, ja, aber die Dateien befinden sich noch in einem Verzeichnis, sodass niemand daran gehindert wird, auf sie zuzugreifen, wenn er die URL kennt.

Sie müssen die Dateien mit demselben Authentifizierungssystem schützen , das Sie zum Schutz des Zugriffs auf die Benutzeroberfläche verwenden. Die einzige Möglichkeit, diese Ressourcen durch die IP-Adresse (die Client- IP-Adresse) zu schützen, wie Sie es derzeit versuchen, .htaccessbesteht darin, dass die IP des Clients im Voraus festgelegt und bekannt ist (wenn dies der Fall wäre, würden Sie keine andere benötigen Form der Authentifizierung).

Dies ist also in erster Linie eine Übung in der Skriptsprache / CMS, die zur Authentifizierung der "Benutzeroberfläche" verwendet wird.

Sie können die .htaccessAnforderungen für diese Dateien in Ihr serverseitiges Skript umschreiben, das die Authentifizierung verwaltet und die Datei nach der Authentifizierung dem Client bereitstellt.

Zum Beispiel:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^uploads/. /serve-protected-file.php [L]

Jede Anfrage nach /uploads/<something>(z. B. /uploads/2020/02/myfile.pdf), die einer gültigen Datei zugeordnet ist, wird an Ihr Skript weitergeleitet : /serve-protected-file.php.

/serve-protected-file.php müsste dann so etwas wie folgendes tun:

// 1. Parse the file being requested from REQUEST_URI

// 2. Is the requested file "protected"?
//    (Serving both protected and public files from the same directory?)

// 3. If not protected then serve/stream the resource to the client. END

// 4. If protected then authenticate the user...

// 5. If user authenticated then serve/stream the resource to the client. END

// 6. Resource is protected and user not authenticated...
//    Serve a 403 Forbidden. END

(Idealerweise befindet sich der Speicherort dieser "geschützten" Ressourcen vollständig außerhalb des Dokumentstamms - sie sind also standardmäßig "privat" - und die URL, über die der Benutzer auf diese Ressourcen zugreift, ist vollständig virtuell. Dann würden Sie sie wahrscheinlich nicht benötigen Jede zusätzliche Codierung .htaccessund alles würde von Ihrem Front-Controller implementiert - aber das hängt alles davon ab, wie Ihre Site implementiert ist und wie URLs weitergeleitet werden.)