Cách từ chối quyền truy cập vào tệp trong .htaccess


112

Tôi có tệp .htaccess sau:

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

Tôi đang cố gắng cấm khách truy cập vào tệp sau:

domain.com/inscription/log.txt

nhưng những gì tôi có ở trên không hoạt động: Tôi vẫn có thể truy cập tệp từ trình duyệt từ xa.

Câu trả lời:


187

Trong một tệp htaccess, phạm vi của <Files>chỉ thị chỉ áp dụng cho thư mục đó (Tôi đoán để tránh nhầm lẫn khi các quy tắc / chỉ thị trong htaccess của thư mục con được áp dụng các quy tắc / chỉ thị từ chính).

Vì vậy, bạn có thể có:

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

Đối với Apache 2.4+, bạn sẽ sử dụng:

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

Trong một tệp htaccess trong inscriptionthư mục của bạn . Hoặc bạn có thể sử dụng mod_rewrite để xử lý cả hai trường hợp từ chối quyền truy cập vào tệp htaccess cũng như log.txt:

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

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

Nếu bạn đang sử dụng IIS, hãy thực hiện việc này trong tệp web.config.
Shaun Luttin

1
Việc sử dụng các quy tắc viết lại sẽ ngăn không cho mã của riêng tôi truy cập vào nội dung của * .txt. Bạn sẽ làm thế nào để giải quyết vấn đề này?
Pantss

8
"phạm vi của <Files>chỉ thị chỉ áp dụng cho thư mục đó" - không, không. Nó áp dụng cho thư mục đó tất cả các thư mục con bên dưới nó. Vì vậy, <Files "log.txt">sẽ bắt /log.txt /inscription/log.txt .
MrWhite

1
Bạn có thể cập nhật câu trả lời này vì Order Allow,Denynó không được dùng trong 2.4 không?
Tiếng Telarian

18

Đối sánh mẫu mạnh - Đây là phương pháp mà tôi sử dụng ở đây tại Perishable Press. Sử dụng đối sánh mẫu mạnh mẽ, kỹ thuật này ngăn chặn truy cập từ bên ngoài vào bất kỳ tệp nào có chứa “ .hta ”, “ .HTA ” hoặc bất kỳ kết hợp phân biệt chữ hoa chữ thường nào của chúng. Để minh họa, mã này sẽ ngăn truy cập thông qua bất kỳ yêu cầu nào sau đây:

  • .htaccess
  • .HTACCESS
  • .hTaCcEsS
  • testFILE.htaccess
  • tên tệp.HTACCESS
  • FILEROOT.hTaCcEsS

.. vv., v.v. Rõ ràng, phương pháp này có hiệu quả cao trong việc bảo mật các tệp HTAccess trên trang web của bạn. Hơn nữa, kỹ thuật này cũng bao gồm chỉ thị " Thỏa mãn tất cả " củng cố . Lưu ý rằng mã này phải được đặt trong tệp HTAccess gốc của miền của bạn:

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

1
Tôi gặp lỗi máy chủ nội bộ 500 khi sử dụng mã này. Bất kỳ ý tưởng tại sao? Tôi đang sử dụng Wordpress.
Keryn Gill

8
Sẽ có ý nghĩa hơn nếu chỉ không cho phép người dùng truy cập vào các tệp dotfiles? Sử dụng một cái gì đó như <Files ~"^\..*">.
Steen Schütt

1
Cần một khoảng cách giữa dấu ngã và dấu ngoặc kép đầu tiên — ít nhất là đối với tôi, tôi cần nó. ~ SPACE "
Art Geigel

Tôi gặp phải hành vi tương tự khi vô hiệu hóa .files: <filesMatch "^ \ .. *"> order cho phép, từ chối từ chối từ tất cả </FilesMatch>
Pinonirvana

14

Tôi không tin câu trả lời hiện đang được chấp nhận là chính xác. Ví dụ: tôi có .htaccesstệp sau trong thư mục gốc của máy chủ ảo (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>

Điều này ngăn chặn quyền truy cập bên ngoài reminder.phpvào thư mục con. Tôi có một .htaccesstệp tương tự trên máy chủ Apache 2.2 của mình có cùng tác dụng:

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

Tôi không biết chắc chắn nhưng tôi nghi ngờ đó là nỗ lực xác định cụ thể thư mục con trong .htaccesstệp, viz <Files ./inscription/log.txt> đang khiến nó không thành công. Sẽ đơn giản hơn nếu bạn đặt .htaccesstệp vào cùng một thư mục log.txttức là trong inscriptionthư mục đó và nó sẽ hoạt động ở đó.


1
Bạn nhận được ủng hộ của tôi, điều này cũng hoạt động cho apache 2.4 của tôi.
Tschallacka

3

Đặt dòng dưới đây vào tệp .htaccess của bạn và thay thế tên tệp như bạn muốn

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

-4

Bạn có thể sử dụng <Directory>thẻ ví dụ:

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

Không sử dụng ./vì nếu bạn chỉ sử dụng /nó sẽ nhìn vào thư mục gốc của trang web của bạn.

Để có ví dụ chi tiết hơn, hãy truy cập vào http://httpd.apache.org/docs/2.2/section.html


2
Nhưng một <Directory>thùng chứa không được phép vào .htaccess. Trong .htaccess, .htaccessbản thân tệp là " Vùng chứa thư mục " (tệp cấu hình cho mỗi thư mục).
MrWhite

Vậy thì bạn có thể sử dụng Chuyển hướng. Redirect /inscription/log.txt access_denied.htmlThao tác này sẽ chuyển hướng người dùng đến access_denied.htmlnếu người dùng truy cập inscription/log.txttrong thư mục dòng chữ.
Nicholas English
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.