.Htaccess dosyasında bir dosyaya erişim nasıl reddedilir


112

Aşağıdaki .htaccess dosyam var:

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

Ziyaretçilerin aşağıdaki dosyaya erişimini yasaklamaya çalışıyorum:

domain.com/inscription/log.txt

ancak yukarıda sahip olduğum şey çalışmıyor: Dosyaya hala tarayıcıdan uzaktan erişebiliyorum.

Yanıtlar:


187

Bir htaccess dosyası içinde, <Files>direktifin kapsamı yalnızca o dizine uygulanır (alt dizinlerin htaccess'indeki kurallar / yönergeler, üst dizinlerden üstün kalarak uygulandığında karışıklığı önlemek için tahmin ediyorum).

Böylece sahip olabilirsiniz:

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

Apache 2.4+ için şunları kullanırsınız:

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

Dizininizdeki bir htaccess dosyasında inscription. Ya da mod_rewrite'ı kullanarak her iki durumda da htaccess dosyasına ve log.txt'ye erişimi reddedebilirsiniz:

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

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

IIS kullanıyorsanız, bunu web.config dosyasında yapın.
Shaun Luttin

1
Yeniden yazma kurallarını kullanmak, kendi kodumun * .txt içeriğine erişmesini engeller. Bunu nasıl aşarsınız?
Pantss

8
" <Files>direktifin kapsamı yalnızca o dizin için geçerlidir" - hayır, değildir. Bu dizin ve altındaki tüm alt dizinler için geçerlidir . Böylece <Files "log.txt">yakalayacak /log.txt ve /inscription/log.txt .
MrWhite

1
Order Allow,Deny2.4'te kullanımdan kaldırıldığı için bu yanıtı güncelleyebilir misiniz ?
Telarian

18

Güçlü kalıp eşleştirme - Bu, Bozulabilir Basın'da kullandığım yöntem. Güçlü desen eşleştirmesi kullanan bu teknik, " .hta ", " .HTA " içeren herhangi bir dosyaya veya bunların büyük / küçük harf duyarlı olmayan herhangi bir kombinasyonuna dışarıdan erişimi engeller . Örnek olarak, bu kod aşağıdaki isteklerden herhangi biri yoluyla erişimi engelleyecektir:

  • .htaccess
  • .htaccess
  • .htaccess
  • testFILE.htaccess
  • filename.HTACCESS
  • FILEROOT.hTaCcEsS

..etc., vb. Açıkçası, bu yöntem sitenizin HTAccess dosyalarının güvenliğini sağlamada oldukça etkilidir. Ayrıca, bu teknik aynı zamanda güçlendirici “ Tümünü Sat ” direktifini de içerir . Bu kodun alanınızın kök HTAccess dosyasına yerleştirilmesi gerektiğini unutmayın:

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

1
Bu kodu kullanırken 500 dahili sunucu hatası alıyorum. Herhangi bir fikrin neden? Wordpress kullanıyorum.
Keryn Gill

8
Kullanıcıların dot dosyalarına erişmesine izin vermemek daha mantıklı olmaz mı? Gibi bir şey kullanarak <Files ~"^\..*">.
Steen Schütt

1
Tilde ve ilk tırnak işareti arasında bir boşluk gerekiyor - en azından benim için buna ihtiyacım vardı. ~ UZAY "
Art Geigel

.Files'ı devre dışı bırakarak aynı davranışı elde ettim: <filesMatch "^ \ .. *"> sırala izin
ver

14

Şu anda kabul edilen cevabın doğru olduğuna inanmıyorum. Örneğin, .htaccessbir sanal sunucunun kök dizininde aşağıdaki dosyam var (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>

Bu reminder.php, bir alt dizinde bulunan harici erişimi engeller . Ben de benzer bir var .htaccessaynı etkiye sahip benim Apache 2.2 sunucusunda dosyayı:

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

Kesin olarak bilmiyorum ama bunun, alt dizini özellikle .htaccessdosyada tanımlama girişimi olduğundan şüpheleniyorum , yani <Files ./inscription/log.txt> başarısız olmasına neden oluyor. .htaccessDosyayı log.txtie ile aynı dizine koymak daha kolay inscriptionolacaktır ve orada çalışacaktır.


1
Ek oyumu aldınız, bu benim apache 2.4 için de çalıştı.
Tschallacka

3

Aşağıdaki satırı .htaccess dosyanıza yerleştirin ve dosya adını istediğiniz gibi değiştirin

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

-4

<Directory>Örneğin etiketini kullanabilirsiniz :

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

Kullanmayın ./çünkü sadece kullanırsanız/ sitenizin kök dizinine bakar.

Daha ayrıntılı bir örnek için http://httpd.apache.org/docs/2.2/sections.html adresini ziyaret edin.


2
Ancak bir <Directory>konteynerin içeri girmesine izin verilmez .htaccess. İçinde .htaccess, .htaccessdosyanın kendisi " Dizin kapsayıcısı" dır (dizin başına yapılandırma dosyası).
MrWhite

O zaman Yönlendirmeyi kullanabilirsiniz. Redirect /inscription/log.txt access_denied.htmlBu, kullanıcı yazıt dizinine access_denied.htmlgiderse kullanıcıyı adresine yeniden yönlendirecektir inscription/log.txt.
Nicholas English
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.