2017-01-14 3 views
2

Ich habe einen Ordner, in dem ich Dateien speichern. Auf diese Dateien kann über die Webseite zugegriffen werden. Nehmen wir an, das Verzeichnis ist wie manual/fileName.pdf.Datei vor direktem Zugriff schützen

Ich habe auch eine Seite, um eine Liste der gespeicherten Dateien im Ordner manual/ anzuzeigen, und diese Seite ist mit Benutzersitzungen geschützt. Sie müssen sich also erst anmelden, bevor Sie auf die Seite zugreifen.

Ich lese das, indem ich einen .htaccess in den Ordner platziere, kann ich verhindern, dass Benutzer direkt auf die Dateien zugreifen. Aber jetzt kann ich nicht einmal von dieser Auflistungsseite auf sie zugreifen.

Hier ist, was ich schreibe in .htaccess:

RewriteEngine on 
RewriteRule .documentation.php 

Und hier ist meine Dateiliste Skript:

if ($handle = opendir('manual')) { 
    while (false !== ($entry = readdir($handle))) { 
    if ($entry != "." && $entry != "..") { 
     if (!preg_match('/.php/', $entry) && !preg_match('/.htaccess/', $entry)) //prevent some file to be shown 
      {echo "<a href='manual/$entry' target='_blank'>$entry</a><hr>";} 
     } 
    } 
    closedir($handle); 
} 

Jede Idee, wie die Dateien zugreifen?

+0

Und die PHP-Auflistung funktioniert, wenn Sie den htaccess fallen lassen? Ich denke nicht. – sepehr

+0

Ja. Warum hast du das gedacht? –

+0

Weil "opendir" das Verzeichnis öffnet, obwohl der Webserver einen 500 internen Fehler ausgibt. Haben Sie die Fehlerprotokolle überprüft? – sepehr

Antwort

2

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.

+0

dann wie kann ich auf Dateien zugreifen, wenn Sie sie außerhalb der Wurzel platzieren? –

+1

PHP kann auf die Dateien außerhalb Ihres Dokumentstammverzeichnisses zugreifen. Siehe [So bedienen Sie große Dateien über PHP] (http://teddy.fr/2007/11/28/how-serve-big-files-through-php/), um die Idee zu verstehen. Sie haben auch andere Problemumgehungen, siehe: [Beste Strategie, um herunterladbare Dateien zu schützen -php/mysql Apache2 Server] (https://stackoverflow.com/a/5377241/65732) und [Serving große geschützte Dateien in PHP/Apache] (https : //stackoverflow.com/a/3232547/65732). – sepehr

Verwandte Themen