So verweigern Sie den Zugriff auf eine Datei in .htaccess


112

Ich habe die folgende .htaccess-Datei:

RewriteEngine On
RewriteBase /

# Protect the htaccess file
<Files .htaccess>
Order Allow,Deny
Deny from all
</Files>

# Protect log.txt
<Files ./inscription/log.txt>
Order Allow,Deny
Deny from all
</Files>

# Disable directory browsing
Options All -Indexes

Ich versuche Besuchern den Zugriff auf die folgende Datei zu verbieten:

domain.com/inscription/log.txt

Aber was ich oben habe, funktioniert nicht: Ich kann weiterhin über den Browser aus der Ferne auf die Datei zugreifen.

Antworten:


187

Innerhalb einer htaccess-Datei gilt der Geltungsbereich der <Files>Direktive nur für dieses Verzeichnis (ich denke, um Verwirrung zu vermeiden, wenn Regeln / Direktiven im htaccess von Unterverzeichnissen angewendet werden, die die vom übergeordneten Verzeichnis ersetzen).

So können Sie haben:

<Files "log.txt">  
  Order Allow,Deny
  Deny from all
</Files>

Für Apache 2.4+ würden Sie Folgendes verwenden:

<Files "log.txt">  
  Require all denied
</Files>

In einer htaccess-Datei in Ihrem inscriptionVerzeichnis. Oder Sie können mod_rewrite verwenden, um beide Fälle so zu behandeln, dass der Zugriff auf die htaccess-Datei sowie auf log.txt verweigert wird:

RewriteRule /?\.htaccess$ - [F,L]

RewriteRule ^/?inscription/log\.txt$ - [F,L]

Wenn Sie IIS verwenden, tun Sie dies stattdessen in der Datei web.config.
Shaun Luttin

1
Die Verwendung der Umschreiberegeln verweigert meinem eigenen Code den Zugriff auf den Inhalt von * .txt. Wie würden Sie das umgehen?
Pantss

8
"Der Geltungsbereich der <Files>Richtlinie gilt nur für dieses Verzeichnis" - nein, das gilt nicht. Es gilt für dieses Verzeichnis und alle darunter liegenden Unterverzeichnisse. Also <Files "log.txt">wird fangen /log.txt und /inscription/log.txt .
MrWhite

1
Können Sie diese Antwort aktualisieren, da Order Allow,Denysie in 2.4 veraltet ist?
Telarian

18

Starker Mustervergleich - Dies ist die Methode, die ich hier bei Perishable Press verwende. Durch die Verwendung eines starken Mustervergleichs verhindert diese Technik den externen Zugriff auf Dateien, die " .hta ", " .HTA " oder eine Kombination davon enthalten, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird . Zur Veranschaulichung verhindert dieser Code den Zugriff über eine der folgenden Anforderungen:

  • .htaccess
  • .HTACCESS
  • .hTaCcEsS
  • testFILE.htaccess
  • Dateiname.HTACCESS
  • FILEROOT.hTaCcEsS

..etc. usw. Diese Methode ist eindeutig sehr effektiv beim Sichern der HTAccess-Dateien Ihrer Site. Darüber hinaus enthält diese Technik auch die verstärkende Richtlinie „ Alle zufrieden stellen “. Beachten Sie, dass dieser Code in der HTAccess-Stammdatei Ihrer Domain abgelegt werden sollte:

# STRONG HTACCESS PROTECTION
<Files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</Files>

1
Bei Verwendung dieses Codes wird ein interner Serverfehler von 500 angezeigt. Irgendeine Idee warum? Ich benutze Wordpress.
Keryn Gill

8
Wäre es nicht sinnvoller, Benutzern den Zugriff auf Punktedateien zu untersagen? Mit so etwas wie <Files ~"^\..*">.
Steen Schütt

1
Benötigen Sie ein Leerzeichen zwischen Tilde und Anführungszeichen - zumindest für mich brauchte ich es. ~ SPACE "
Art Geigel

Ich habe das gleiche Verhalten beim Deaktivieren von .files erhalten: <filesMatch "^ \ .. *"> Reihenfolge zulassen, Verweigerung von allen verweigern </ FileMatch>
Pinonirvana

14

Ich glaube nicht, dass die derzeit akzeptierte Antwort richtig ist. Zum Beispiel habe ich die folgende .htaccessDatei im Stammverzeichnis eines virtuellen Servers (Apache 2.4):

<Files "reminder.php">
require all denied
require host localhost
require ip 127.0.0.1
require ip xxx.yyy.zzz.aaa
</Files>

Dies verhindert den externen Zugriff auf reminder.phpein Unterverzeichnis. Ich habe eine ähnliche .htaccessDatei auf meinem Apache 2.2-Server mit dem gleichen Effekt:

<Files "reminder.php">
        Order Deny,Allow
        Deny from all
        Allow from localhost
        Allow from 127.0.0.1
     Allow from xxx.yyy.zzz.aaa
</Files>

Ich weiß es nicht genau , aber ich vermute , dass es der Versuch ist das Unterverzeichnis speziell in der definieren .htaccessDatei, nämlich <Files ./inscription/log.txt> die es verursacht scheitern. Es wäre einfacher, die .htaccessDatei im selben Verzeichnis wie log.txtdh im inscriptionVerzeichnis abzulegen, und es wird dort funktionieren.


1
Du bekommst meine Gegenstimme, das hat auch bei meinem Apache 2.4 funktioniert.
Tschallacka

3

Fügen Sie die folgende Zeile in Ihre .htaccess-Datei ein und ersetzen Sie den Dateinamen nach Ihren Wünschen

RewriteRule ^(test\.php) - [F,L,NC]

-4

Nun, Sie könnten das <Directory>Tag zum Beispiel verwenden:

<Directory /inscription>
  <Files log.txt>
    Order allow,deny
    Deny from all
  </Files>
</Directory>

Nicht verwenden, ./da bei einer Verwendung nur /das Stammverzeichnis Ihrer Site angezeigt wird.

Ein ausführlicheres Beispiel finden Sie unter http://httpd.apache.org/docs/2.2/sections.html


2
Ein <Directory>Container ist aber nicht erlaubt .htaccess. In .htaccessist die .htaccessDatei selbst der " Verzeichniscontainer " (Konfigurationsdatei pro Verzeichnis).
MrWhite

Dann könnten Sie die Umleitung verwenden. Redirect /inscription/log.txt access_denied.htmlDadurch wird der Benutzer weitergeleitet, access_denied.htmlwenn der Benutzer inscription/log.txtin das Beschriftungsverzeichnis wechselt.
Nicholas English
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.