Restrição de acesso do Apache com base no nome do arquivo e do diretório

1

Gostaria de configurar httpd.conf para negar arquivos que correspondam a ou dos seguintes itens:

  1. Um diretório que começa com . ou _
  2. Um arquivo que começa com . ou _ , mas não corresponde a __\w+__\.\w+

Por exemplo:

/_private/anything       ->  deny (rule 1)
/_private/__init__.py    ->  deny (rule 1)
/_private/_private.txt   ->  deny (rule 1+2)

/public/_private.txt     ->  deny (rule 2)
/public/__private.txt    ->  deny (rule 2)
/public/__public__.txt   ->  allow 

Estou trabalhando com <Directory ~ "..."> e <Files ~ "..."> , bem como com RewriteRule , mas não consegui fazer com que funcione corretamente.

Sugestões muito apreciadas!

Obrigado!

Atualização: em resposta ao CK:
<Directory "/var/www/html">
    Order allow,deny
    Allow from all
</Directory>

Atualização 2: Alguém sabe por que esta diretiva está combinando e negando um URL como /_test.php , quando claramente não é um "diretório"? (Eu removi TODAS as seções <Files> exceto o .htaccess.)

<Directory ~ "/[._]">
    Order allow,deny
    Deny from all
</Directory>
    
por gahooa 04.08.2009 / 01:16

3 respostas

1

EDIT: da postagem de comentário post original não estava certo - abaixo é novo Rewrite rule set:

RewriteRule /\..+ - [F]
RewriteCond %{REQUEST_URI} ^/[^_]+/__\w+__\.\w+$ [NC]
RewriteRule ^ - [S=1]
RewriteRule /_.+ - [F]

A ordem é importante aqui: - proíba qualquer coisa que comece com o período (.) primeiro - é uma regra "global" sem nenhum caso especial. - o caso especial de \ w + . \ w + deve ser permitido até o próximo S = 1 pula a próxima regra sendo - proíbe qualquer coisa que comece com sublinhado (_)

    
por 04.08.2009 / 03:07
0

Parece que você está procurando por "DirectoryMatch e FileMatch.

No site do apache httpd. link

< DirectoryMatch > e < / DirectoryMatch > são usados para incluir um grupo de diretivas que serão aplicadas apenas ao diretório e subdiretórios nomeados desse diretório, o mesmo que. No entanto, leva como argumento uma expressão regular.

link

O < FilesMatch > directiva limita o âmbito das directivas em anexo por nome de ficheiro, tal como o < Arquivos > diretiva faz. No entanto, aceita uma expressão regular.

    
por 04.08.2009 / 02:27
0

como na maioria das coisas assim, a ordem das regras é crucial.

a melhor regra básica, IMO, é colocar as exceções de casos especiais primeiro e depois a regra de maiúsculas e minúsculas, assim:

  1. permite arquivos que correspondam (^ | /) __ \ w + __. \ w + $
  2. nega arquivos ou diretórios correspondentes (^ | /)[._]

Se o pedido fosse revertido acima, a exceção de correspondência de arquivo nunca seria alcançada, portanto, não teria nenhum efeito.

BTW, por que essas regras tolas? por que não apenas colocar arquivos públicos em um diretório e arquivos privados em outro? Por que arquivos privados como '_private.txt' em um diretório chamado / public? Por que tornar seus nomes públicos de arquivos e diretórios tão irritantemente semelhantes aos seus nomes privados? faria mais sentido fazer as coisas de uma maneira mais conveniente e sensata - às vezes a melhor resposta é DDTT - "Don't Do That, Then".

    
por 04.08.2009 / 02:30