Jak odmówić dostępu do pliku w .htaccess

112

Mam następujący plik .htaccess:

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

Próbuję zabronić odwiedzającym dostępu do następującego pliku:

domain.com/inscription/log.txt

ale to, co mam powyżej, nie działa: nadal mogę uzyskać zdalny dostęp do pliku z przeglądarki.

Timothée HENRY
źródło

Odpowiedzi:

187

W pliku htaccess, zakres <Files>dyrektywy dotyczy tylko tego katalogu (myślę, że aby uniknąć nieporozumień, gdy reguły / dyrektywy w htaccess podkatalogów zostaną zastosowane zamiast tych z nadrzędnego).

Możesz więc mieć:

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

W przypadku Apache 2.4+ używałbyś:

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

W pliku htaccess w Twoim inscriptionkatalogu. Lub możesz użyć mod_rewrite do obsługi obu przypadków odmowy dostępu do pliku htaccess, a także do log.txt:

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

RewriteRule ^/?inscription/log\.txt$ - [F,L]
Jon Lin
źródło
Jeśli korzystasz z usług IIS, zrób to w pliku web.config.
Shaun Luttin
1
Korzystanie z reguł przepisywania uniemożliwia mojemu własnemu kodowi dostęp do zawartości * .txt. Jak byś to obejść?
Spodnie
8
„zakres <Files>dyrektywy dotyczy tylko tego katalogu” - nie, nie ma. Dotyczy tego katalogu i wszystkich podkatalogów pod nim. Więc <Files "log.txt">złapie /log.txt i /inscription/log.txt .
MrWhite
1
Czy możesz zaktualizować tę odpowiedź, ponieważ Order Allow,Denyjest przestarzała w wersji 2.4?
Telarian
18

Silne dopasowanie wzorców - to jest metoda, której używam w Perishable Press. Używając silnego dopasowania wzorców, technika ta zapobiega zewnętrznemu dostępowi do dowolnego pliku zawierającego „ .hta ”, „ .HTA ” lub ich kombinacji bez rozróżniania wielkości liter. Aby to zilustrować, ten kod uniemożliwi dostęp przez którekolwiek z następujących żądań:

  • .htaccess
  • .HTACCESS
  • .hTaCcEs
  • testFILE.htaccess
  • nazwa_pliku.HTACCESS
  • FILEROOT.HTACCES

..etc., itd. Oczywiście ta metoda jest bardzo skuteczna w zabezpieczaniu plików HTAccess Twojej witryny. Co więcej, technika ta obejmuje również wzmacniającą dyrektywę „ Satisfy All ”. Pamiętaj, że ten kod należy umieścić w głównym pliku HTAccess domeny:

# STRONG HTACCESS PROTECTION
<Files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</Files>
Yaşar Xavan
źródło
1
Podczas używania tego kodu pojawia się wewnętrzny błąd serwera 500. Każdy pomysł, dlaczego? Używam Wordpress.
Keryn Gill
8
Czy nie miałoby sensu po prostu uniemożliwić użytkownikom dostęp do dotfiles? Używając czegoś takiego jak <Files ~"^\..*">.
Steen Schütt
1
Potrzebuję spacji między tyldą a pierwszym cudzysłowem - przynajmniej ja tego potrzebowałem. ~ SPACJA ”
Art Geigel
Otrzymałem to samo zachowanie wyłączając .files: <filesMatch "^ \ .. *"> zamów zezwalaj, odmawiaj, odmawiaj od wszystkich </FilesMatch>
Pinonirvana
14

Nie sądzę, aby obecnie zaakceptowana odpowiedź była poprawna. Na przykład mam następujący .htaccessplik w katalogu głównym serwera wirtualnego (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>

Zapobiega to dostępowi zewnętrznemu, do reminder.phpktórego znajduje się w podkatalogu. Mam podobny .htaccessplik na moim serwerze Apache 2.2 z takim samym skutkiem:

<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>

Nie wiem na pewno, ale podejrzewam, że jest to próba zdefiniowania podkatalogu konkretnie w .htaccesspliku, a mianowicie, <Files ./inscription/log.txt> która powoduje jego niepowodzenie. Byłoby prościej umieścić .htaccessplik w tym samym katalogu co log.txtnp. W inscriptionkatalogu i tam będzie działał.

Nik Dow
źródło
1
Dostajesz moje upvote, to zadziałało również dla mojego Apache 2.4.
Tschallacka
3

Umieść poniższą linię w swoim pliku .htaccess i zmień nazwę pliku, jak chcesz

RewriteRule ^(test\.php) - [F,L,NC]
Rakesh Dongarwar
źródło
-4

Cóż, możesz użyć <Directory>tagu na przykład:

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

Nie używaj, ./ponieważ jeśli po prostu używasz /, patrzy na katalog główny Twojej witryny.

Bardziej szczegółowy przykład można znaleźć pod adresem http://httpd.apache.org/docs/2.2/sections.html

Nicholas English
źródło
2
Ale <Directory>pojemnik nie jest dozwolony .htaccess. W .htaccessThe.htaccess sam plik jest „ kontenerem katalogu ” (plikiem konfiguracyjnym dla każdego katalogu).
MrWhite
Cóż, możesz użyć przekierowania. Redirect /inscription/log.txt access_denied.htmlTo przekieruje użytkownika do, access_denied.htmljeśli użytkownik przejdzie do inscription/log.txtkatalogu inskrypcji.
Nicholas English