Blockieren Sie den direkten Zugriff auf eine Datei über http, erlauben Sie jedoch den Zugriff auf PHP-Skripte


73

Ich lade meine Dateien (pdf, doc, flv usw.) in einen Puffer und stelle sie meinen Benutzern mit einem Skript zur Verfügung. Ich benötige mein Skript, um auf die Datei zugreifen zu können, aber keinen direkten Zugriff darauf zuzulassen. Was ist der beste Weg, um dies zu erreichen? Sollte ich etwas mit meinen Berechtigungen tun oder das Verzeichnis mit .htaccess sperren?


Antworten:


97

Am sichersten ist es, die gewünschten Dateien außerhalb des Web-Stammverzeichnisses zu speichern, wie Damien vorgeschlagen hat. Dies funktioniert, weil der Webserver lokalen Dateisystemberechtigungen folgt, nicht seinen eigenen Berechtigungen.

Es gibt jedoch viele Hosting-Unternehmen, die Ihnen nur Zugriff auf das Webstammverzeichnis gewähren. Um weiterhin HTTP-Anforderungen an die Dateien zu verhindern, legen Sie sie mit einer .htaccess-Datei, die die gesamte Kommunikation blockiert, in einem eigenen Verzeichnis ab. Zum Beispiel,

Order deny,allow
Deny from all

Ihr Webserver und damit Ihre serverseitige Sprache können sie weiterhin lesen, da der Webserver aufgrund der lokalen Berechtigungen des Verzeichnisses die Dateien lesen und ausführen kann.


Ich habe dies im Audio-Ordner verwendet, aber es stoppt meinen Audio-Player, um Audio abzuspielen. Ich verwende Sound Manager 2, um Audio abzuspielen. Gibt es eine Umgehungsmöglichkeit, die es nur dem Soundmanager ermöglicht, diese Audiodatei abzuspielen, aber keinen anderen direkten Zugriff zu verhindern?
Sonill

4
@sonill - Sie können bestimmte IP-Adressen auf eine weiße Liste setzen, um auf diese Verzeichnisse zugreifen zu können. Wenn Sie beispielsweise eine neue Zeile mit hinzufügen Allow from 127.0.0.1, kann Ihr Server, einschließlich aller serverseitigen Codes, auf Dateien in diesem Verzeichnis zugreifen. Weitere Dokumentation zu diesen Bits finden Sie unter httpd.apache.org/docs/2.4/mod/mod_access_compat.html#allow
Sam Bisbee

1
"Es gibt jedoch viele Hosting-Unternehmen, die Ihnen nur Zugriff auf das Web-Root gewähren." Warum können diese Unternehmen das Webstammverzeichnis nicht eine Ebene niedriger als das FTP-Stammverzeichnis platzieren? Haben sie keine Kenntnisse darüber, wie PHP funktioniert (oder ist es eher ein Versehen, das wahrscheinlicher ist), oder kümmern sie sich nur um ihre eigene Sicherheit und ihr Geld? Wählen Sie einfach eine Firma aus, die sich wirklich um die Sicherheit Ihrer Website kümmert.
FluorescentGreen5

1
Ich habe dies versucht, kann die Dateien jedoch nach dem Herunterladen nicht öffnen: Stream konnte nicht geöffnet werden: HTTP-Anforderung fehlgeschlagen! HTTP / 1.1 403 Verboten
Zylo

2
Funktioniert nicht, wenn wir versuchen, über ein PHP-Skript darauf zuzugreifen. Sie haben einen Code, wie Sie auf diese Datei zugreifen können
Mukesh Panchal

34

Auf diese Weise habe ich den direkten Zugriff von URL auf meine INI-Dateien verhindert. Fügen Sie den folgenden Code in die .htaccessDatei im Stammverzeichnis ein. (kein zusätzlicher Ordner erforderlich)

<Files ~ "\.ini$">
  Order allow,deny
  Deny from all
</Files>

Meine settings.iniDatei befindet sich im Stammverzeichnis und ist ohne diesen Code unter www.mydomain.com/settings.ini zugänglich


3

in httpd.conf, um den Browser- und Wget-Zugriff zu blockieren, um Dateien einzuschließen, insbesondere db.inc oder config.inc. Beachten Sie, dass Sie Dateitypen in der Direktive nicht verketten können, sondern mehrere Dateirichtlinien erstellen.

<Files ~ "\.inc$">
Order allow,deny
Deny from all
</Files>

um Ihre Konfiguration vor dem Neustart von Apache zu testen

service httpd configtest

dann (würdevoller Neustart)

service httpd graceful

2

Befinden sich die Dateien auf demselben Server wie das PHP-Skript? Wenn ja, halten Sie die Dateien einfach aus dem Webstamm heraus und stellen Sie sicher, dass Ihr PHP-Skript Leseberechtigungen für jeden Speicherort hat.


1

Wenn Sie Zugriff auf Ihre httpd.conf-Datei haben (in Ubuntu befindet sie sich im Verzeichnis / etc / apache2), sollten Sie die gleichen Zeilen wie in der .htaccessDatei im jeweiligen Verzeichnis hinzufügen . Das heißt (zum Beispiel):

ServerName YOURSERVERNAMEHERE
<Directory /var/www/>
AllowOverride None
order deny,allow
Options -Indexes FollowSymLinks
</Directory>

Führen Sie dies für jedes Verzeichnis aus, in dem Sie die Informationen steuern möchten, und Sie haben eine Datei an einem Ort, um den gesamten Zugriff zu verwalten. Im obigen Beispiel habe ich es für das Stammverzeichnis / var / www gemacht.

Diese Option ist möglicherweise nicht für ausgelagertes Hosting verfügbar, insbesondere für Shared Hosting. Es ist jedoch eine bessere Option als das Hinzufügen vieler .htaccessDateien.


1

Um zu verhindern, dass INI-Dateien auf das Web zugreifen, fügen Sie Folgendes in apache2.conf ein

<Files ~ "\.ini$">
Order allow,deny
Deny from all
</Files>

0

Wie wäre es mit einem benutzerdefinierten modulbasierten .htaccess-Skript (wie es in CodeIgniter verwendet wird)? Ich habe es versucht und es hat in CodeIgniter-Apps gut funktioniert. Irgendwelche Ideen, um es auf anderen Apps zu verwenden?

<IfModule authz_core_module>
    Require all denied
</IfModule>
<IfModule !authz_core_module>
    Deny from all
</IfModule>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.