Як заборонити доступ до файлу в .htaccess


112

У мене є такий файл .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

Я намагаюся заборонити відвідувачам отримувати доступ до такого файлу:

domain.com/inscription/log.txt

але те, що я маю вище, не працює: я все одно можу отримати доступ до файлу з браузера віддалено.

Відповіді:


187

У файлі htaccess обсяг <Files> директиви застосовується лише до цього каталогу (я думаю, щоб уникнути плутанини, коли правила / директиви в htaccess підкаталогів застосовуються заміщеними від батьківського).

Отже, ви можете мати:

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

Для Apache 2.4+ ви використовуєте:

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

У файлі htaccess у вашому inscriptionкаталозі. Або ви можете використовувати mod_rewrite для впорядкування обох випадків заборонити доступ до файлу htaccess, а також log.txt:

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

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

Якщо ви використовуєте IIS, зробіть це замість файлу web.config.
Шон Люттин

1
Використання правил перезапису забороняє моєму коду отримувати доступ до вмісту * .txt. Як би ти обійшов це?
Pantss

8
"Дія <Files>директиви застосовується лише до цього каталогу" - ні, це не так. Він застосовується до цього каталогу та всіх підкаталогів під ним. Так <Files "log.txt">зловить /log.txt і /inscription/log.txt .
MrWhite

1
Чи можете ви оновити цю відповідь, оскільки Order Allow,Denyзастаріла в 2.4?
Телярій

18

Сильне узгодження шаблону - це метод, який я використовую тут, на Perishable Press. Використовуючи чітке узгодження шаблонів, ця методика запобігає зовнішньому доступу до будь-якого файлу, що містить " .hta ", " .HTA ", або будь-яку нечутливу до регістру комбінацію. Для ілюстрації, цей код буде перешкоджати доступу через будь-який із наступних запитів:

  • .htaccess
  • .HTACCESS
  • .hTaCcEsS
  • testFILE.htaccess
  • ім'я файлу.HTACCESS
  • FILEROOT.hTaCcEsS

..etc. і т. д. Очевидно, що цей метод є високоефективним при захисті файлів HTAccess вашого сайту. Крім того, ця методика також включає зміцнюючу директиву " Задовольнити всіх ". Зауважте, що цей код повинен бути розміщений у кореневому файлі HTAccess вашого домену:

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

1
Я отримую 500 внутрішніх помилок сервера при використанні цього коду. Будь-яка ідея чому? Я використовую Wordpress.
Keryn Gill

8
Чи не було б більше сенсу просто заборонити користувачам отримувати доступ до dotfiles? Використання чогось подібного <Files ~"^\..*">.
Стівен Шютт

1
Потрібний пробіл між тильдою та першою лапкою - принаймні для мене мені це було потрібно. ~ SPACE "
Art Geigel

Я отримав таку саму поведінку відключення .files: <filesMatch "^ \ .. *"> замовлення дозволити, відмовити відмовити від усіх </FilesMatch>
Pinonirvana

14

Я не вважаю, що прийнята на даний момент відповідь є правильною. Наприклад, у мене є такий .htaccessфайл у корені віртуального сервера (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>

Це запобігає зовнішньому доступу до reminder.phpякого знаходиться у підкаталозі. У мене схожий .htaccessфайл на моєму сервері Apache 2.2 з тим же ефектом:

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

Я не знаю точно, але я підозрюю, що це спроба визначити підкаталог конкретно у .htaccessфайлі, а саме <Files ./inscription/log.txt> це спричинить його збій. Було б простіше помістити .htaccessфайл у той самий каталог, що і log.txtв inscriptionкаталог, і він буде там працювати.


1
Ви отримаєте мою нагороду, це працювало і для мого apache 2.4.
Чхаллачка

3

Розмістіть нижній рядок у вашому .htaccess-файлі та замініть ім'я файлу за своїм бажанням

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

-4

Ну, ви можете використовувати <Directory>тег, наприклад:

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

Не використовуйте, ./тому що якщо ви просто використовуєте, /він переглядає кореневий каталог вашого сайту.

Більш детальний приклад відвідайте http://httpd.apache.org/docs/2.2/sections.html


2
Але <Directory>контейнер заборонено в .htaccess. У .htaccessсамому .htaccessфайлі є " контейнер каталогів " (конфігураційний файл за каталогом).
MrWhite

Ну тоді ви могли б скористатися Перенаправленням. Redirect /inscription/log.txt access_denied.htmlЦе призведе до переадресації користувача, access_denied.htmlякщо він перейде inscription/log.txtв каталог написів.
Ніколас Англійський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.