Como negar acesso a um arquivo em .htaccess


112

Eu tenho o seguinte arquivo .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

Estou tentando proibir os visitantes de acessar o seguinte arquivo:

domain.com/inscription/log.txt

mas o que tenho acima não funciona: ainda consigo acessar o arquivo do navegador remotamente.

Respostas:


187

Dentro de um arquivo htaccess, o escopo da <Files>diretiva só se aplica a esse diretório (eu acho que para evitar confusão quando as regras / diretivas no htaccess dos subdiretórios são aplicadas substituindo as do pai).

Então você pode ter:

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

Para Apache 2.4+, você usaria:

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

Em um arquivo htaccess em seu inscriptiondiretório. Ou você pode usar mod_rewrite para lidar com ambos os casos de negação de acesso ao arquivo htaccess, bem como log.txt:

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

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

Se estiver usando o IIS, faça isso no arquivo web.config.
Shaun Luttin

1
Usar as regras de reescrita impede que meu próprio código acesse o conteúdo de * .txt. Como você contornar isso?
Calças

8
"o escopo da <Files>diretiva só se aplica a esse diretório" - não, não. Ele se aplica a esse diretório e a todos os subdiretórios abaixo dele. Então <Files "log.txt">vai pegar /log.txt e /inscription/log.txt .
MrWhite

1
Você pode atualizar esta resposta, uma vez que Order Allow,Denyestá obsoleto no 2.4?
Telarian

18

Combinação de padrões fortes - este é o método que uso aqui na Perishable Press. Usando forte correspondência de padrões, esta técnica impede o acesso externo a qualquer arquivo contendo “ .hta ”, “ .HTA ” ou qualquer combinação dos mesmos que não diferencia maiúsculas de minúsculas. Para ilustrar, este código impedirá o acesso por meio de qualquer uma das seguintes solicitações:

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

..etc., etc. Claramente, este método é altamente eficaz para proteger os arquivos HTAccess do seu site. Além disso, essa técnica também inclui a diretiva fortificante " Satisfaça a Todos ". Observe que este código deve ser colocado no arquivo HTAccess raiz de seu domínio:

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

1
Recebo um erro de servidor interno 500 ao usar este código. Alguma ideia do porquê? Estou usando o Wordpress.
Keryn Gill

8
Não faria mais sentido simplesmente proibir os usuários de acessarem dotfiles? Usando algo parecido <Files ~"^\..*">.
Steen Schütt

1
Precisa de um espaço entre o til e a primeira aspa - pelo menos para mim eu precisava. ~ SPACE "
Art Geigel

Obtive o mesmo comportamento desabilitando .files: <filesMatch "^ \ .. *"> pedido permitir, negar negar de todos </FilesMatch>
Pinonirvana

14

Não acredito que a resposta aceita atualmente esteja correta. Por exemplo, tenho o seguinte .htaccessarquivo na raiz de um servidor 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>

Isso impede o acesso externo ao reminder.phpque está em um subdiretório. Eu tenho um .htaccessarquivo semelhante em meu servidor Apache 2.2 com o mesmo efeito:

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

Não sei ao certo, mas suspeito que seja a tentativa de definir o subdiretório especificamente no .htaccessarquivo, a saber , <Files ./inscription/log.txt>que está causando a falha. Seria mais simples colocar o .htaccessarquivo no mesmo diretório, log.txtou seja, no inscriptiondiretório e ele funcionará lá.


1
Você conseguiu meu upvote, isso funcionou para meu apache 2.4 também.
Tschallacka

3

Coloque a linha abaixo em seu arquivo .htaccess e substitua o nome do arquivo como desejar

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

-4

Bem, você pode usar a <Directory>tag, por exemplo:

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

Não use ./porque se você apenas usá- /lo olha o diretório raiz do seu site.

Para obter um exemplo mais detalhado, visite http://httpd.apache.org/docs/2.2/sections.html


2
Mas um <Directory>contêiner não é permitido .htaccess. Em .htaccess, o .htaccesspróprio arquivo é o " contêiner do diretório " (arquivo de configuração por diretório).
MrWhite

Bem, então você pode usar o Redirect. Redirect /inscription/log.txt access_denied.htmlIsso redirecionará o usuário para access_denied.htmlse ele for para inscription/log.txtno diretório de inscrição.
Nicholas English
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.