Cara menolak akses ke file di .htaccess

112

Saya memiliki file .htaccess berikut:

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

Saya mencoba melarang pengunjung untuk mengakses file berikut:

domain.com/inscription/log.txt

tetapi yang saya miliki di atas tidak berfungsi: Saya masih dapat mengakses file dari browser dari jarak jauh.

Timothée HENRY
sumber

Jawaban:

187

Dalam file htaccess, cakupan <Files>direktif hanya berlaku untuk direktori itu (saya kira untuk menghindari kebingungan ketika aturan / arahan di htaccess subdirektori diterapkan menggantikan yang dari induk).

Jadi, Anda dapat memiliki:

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

Untuk Apache 2.4+, Anda akan menggunakan:

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

Dalam file htaccess di inscriptiondirektori Anda . Atau Anda dapat menggunakan mod_rewrite untuk menangani kedua kasus yang menolak akses ke file htaccess serta log.txt:

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

RewriteRule ^/?inscription/log\.txt$ - [F,L]
Jon Lin
sumber
Jika Anda menggunakan IIS, lakukan ini di file web.config.
Shaun Luttin
1
Menggunakan aturan penulisan ulang menyangkal kode saya sendiri mengakses konten * .txt. Bagaimana Anda menyiasati ini?
Celana
8
"ruang lingkup <Files>direktif hanya berlaku untuk direktori itu" - tidak, tidak. Ini berlaku untuk direktori itu dan semua subdirektori di bawahnya. Jadi <Files "log.txt">akan menangkap /log.txt dan /inscription/log.txt .
MrWhite
1
Dapatkah Anda memperbarui jawaban ini karena Order Allow,Denysudah tidak digunakan lagi di 2.4?
Telarian
18

Pencocokan pola yang kuat - Ini adalah metode yang saya gunakan di sini di Perishable Press. Menggunakan pencocokan pola yang kuat, teknik ini mencegah akses eksternal ke file apa pun yang berisi " .hta ", " .HTA ", atau kombinasi tidak peka huruf besar kecil apa pun darinya. Sebagai ilustrasi, kode ini akan mencegah akses melalui salah satu permintaan berikut:

  • .htaccess
  • .HTACCESS
  • .hTaCcEsS
  • testFILE.htaccess
  • nama file.HTACCESS
  • FILEROOT.hTaCcEsS

..etc., dll. Jelas, metode ini sangat efektif untuk mengamankan file HTAccess situs Anda. Lebih jauh, teknik ini juga mencakup arahan " Satisfy All " yang memperkuat . Perhatikan bahwa kode ini harus ditempatkan di file HTAccess root domain Anda:

# STRONG HTACCESS PROTECTION
<Files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</Files>
Yaşar Xavan
sumber
1
Saya mendapatkan kesalahan server internal 500 saat menggunakan kode ini. Tahu kenapa? Saya menggunakan Wordpress.
Keryn Gill
8
Bukankah lebih masuk akal untuk melarang pengguna mengakses dotfiles? Menggunakan sesuatu seperti <Files ~"^\..*">.
Steen Schütt
1
Perlu spasi antara tilde dan tanda kutip pertama — setidaknya bagi saya, saya membutuhkannya. ~ SPACE "
Art Geigel
Saya memperoleh perilaku yang sama dengan menonaktifkan .files: <filesMatch "^ \ .. *"> order allow, deny deny from all </FilesMatch>
Pinonirvana
14

Saya tidak yakin jawaban yang diterima saat ini benar. Misalnya, saya memiliki .htaccessfile berikut di root server virtual (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>

Ini mencegah akses eksternal reminder.phpyang ada di subdirektori. Saya memiliki .htaccessfile serupa di server Apache 2.2 saya dengan efek yang sama:

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

Saya tidak tahu pasti tetapi saya curiga itu adalah upaya untuk menentukan subdirektori secara khusus dalam .htaccessfile, yaitu <Files ./inscription/log.txt> yang menyebabkannya gagal. Akan lebih mudah untuk meletakkan .htaccessfile di direktori yang sama dengan log.txtie di inscriptiondirektori dan itu akan bekerja di sana.

Nik Dow
sumber
1
Anda mendapatkan upvote saya, ini juga berfungsi untuk apache 2.4 saya.
Tschallacka
3

Letakkan baris di bawah ini di file .htaccess Anda dan ganti nama file sesuai keinginan

RewriteRule ^(test\.php) - [F,L,NC]
Rakesh Dongarwar
sumber
-4

Nah Anda bisa menggunakan <Directory>tag misalnya:

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

Jangan gunakan ./karena jika Anda hanya menggunakannya /terlihat di direktori root situs Anda.

Untuk contoh yang lebih detail, kunjungi http://httpd.apache.org/docs/2.2/sections.html

Nicholas Inggris
sumber
2
Tetapi <Directory>wadah tidak diizinkan masuk .htaccess. Dalam .htaccess, .htaccessfile itu sendiri adalah " wadah Direktori " (file konfigurasi per direktori).
MrWhite
Kalau begitu Anda bisa menggunakan Redirect. Redirect /inscription/log.txt access_denied.htmlIni akan mengarahkan pengguna ke access_denied.htmljika pengguna masuk ke inscription/log.txtdalam direktori prasasti.
Nicholas English