Como negar o acesso da web a alguns arquivos?

13

Eu preciso fazer uma operação um pouco estranha.

Primeiro, eu corro no Debian, apache2 (que 'roda' como usuário www-data)

Então, eu tenho um arquivo de texto simples com .txt ou .ini, ou qualquer extensão, não importa.

Esses arquivos estão localizados em subpastas com uma estrutura como esta:

www.example.com/folder1/car/foobar.txt www.example.com/folder1/cycle/foobar.txt www.example.com/folder1/fish/foobar.txt www.example.com/folder1/fruit/foobar .TXT

portanto, o nome do arquivo sempre o mesmo, idem para a 'hierarquia', basta alterar o nome da pasta: /folder-name-static/folder-name-dinamyc/file-name-static.txt

O que devo fazer é (acho) relativamente simples: devo ser capaz de ler esse arquivo por programas no servidor (python, php por exemplo), mas se eu tentar recuperar o conteúdo do arquivo por broswer (digitando a URL www. example.com/folder1/car/foobar.txt, ou via cUrl, etc.) Devo receber um erro proibido, ou qualquer outra coisa, mas não acessar o arquivo .

Também seria bom que mesmo acessar esses arquivos via FTP estivesse 'oculto' ou não pudesse ser baixado (pelo menos eu uso com a raiz ftp e os dados do usuário)

Como eu posso fazer?

Achei isso online, ser colocado no arquivo .htaccess:

<Files File.txt>
 Order allow, deny
 Deny from all
</ Files>

Parece funcionar, mas apenas se o arquivo estiver na raiz da web (www.example.com/myfile.txt) e não nas subpastas. Além disso, as pastas no segundo nível (www.example.com/folder1/ fruit /foobar.txt) serão criadas dinamicamente. Gostaria de evitar a necessidade de alterar o arquivo .htaccess de tempos em tempos.

É possível criar uma regra, algo assim, que se aplica a todos os arquivos com nome determinado, que está em * www.example.com / nome-da-pasta-estático / * nome-da-pasta-dinamyc / *** nome do arquivo -static.txt *, onde essas partes são sempre iguais , apenas ** essa mudança ?

EDIT :

Como Dave Drager disse, eu poderia simplificar isso mantendo esses arquivos fora do diretório acessível na web. Mas esses diretórios também conterão outros arquivos, imagens e outras coisas usadas pelos meus usuários, então simplesmente tento não ter um sistema de pastas duplicadas, como:

/var/www/vhosts/example.com/httpdocs/folder1/car/[other folders and files here]
/var/www/vhosts/example.com/httpdocs/folder1/cycle/[other folders and files here]
/var/www/vhosts/example.com/httpdocs/folder1/fish/[other folders and files here]

//and, then for the 'secrets' files:

/folder1/data/car/foobar.txt
/folder1/data/cycle/foobar.txt
/folder1/data/fish/foobar.txt
Strae
fonte

Respostas:

19

Você pode usar Files / FilesMatch e uma expressão regular:

<Files ~ "\.txt$">
    Order allow,deny
    Deny from all
</Files>

É assim que o .htpasswd está protegido.

ou redirecione qualquer acesso de .txt para um 404:

RedirectMatch 404 \.txt$
rkthkr
fonte
Eu tentei usar esse caminho, mas parece que não faça funciona em arquivo em subpastas
Strae
Fixei meu regexps, desculpe ...
rkthkr
ok .. pode funcionar. Mas .. o regexp deve ser como RedirectMatch 404 \ myfilename.txt $, certo? Os arquivos sempre terão o mesmo nome, mas em pastas diferentes. E essa solução não afetará o método FTP, certo?
Strae
Isso parece correto ...
rkthkr
Sim, confirmo que funciona ... mas meu regexp RedirectMatch 404 \ myfilename.txt $ deve estar errado .. funciona se eu usar RedirectMatch 404 \ .txt $, bloqueando todos os arquivos .txt, mas não se eu usar o nome do arquivo no regexp. Qualquer ajuda? Im não um gênio com regexp;)
Strae
1

Sim, tudo isso é possível. No entanto, se você possui programas no servidor que precisam acessar arquivos de texto, eles devem residir fora da raiz da web. Por exemplo, se seus arquivos da web estiverem em ~ / public_html /, você deverá armazená-los em ~ / data. Não há razão para colocá-los na pasta pública html.

Além de removê-los da pasta da web, verifique se as permissões unix estão definidas corretamente neles. O usuário dos scripts precisaria ter acesso de leitura (gravação?), Mas ninguém mais precisa ter esse acesso.

Se você precisar desses arquivos em uma pasta acessível na Web, existem maneiras de fazer o que você está solicitando através do mod_rewrite. Veja o site a seguir para muitos exemplos, um dos quais deve ser adequado à conta.

http://perishablepress.com/press/2006/01/10/stupid-htaccess-tricks/

Dave Drager
fonte
Os arquivos serão criados via python ou php e, em seguida, nunca editados novamente, basta ler.
Strae 9/06/09
0

Por que não usar permissões de arquivo unix padrão para negar acesso ao arquivo?

Há uma explicação decente na wikipedia sobre permissões de arquivo unix

cyberkni
fonte
Como posso definir permissões para permitir que o usuário root, php, python, lide com esses arquivos e os navegadores não acessem?
Strae
0

Coloque o arquivo .htaccess no subdiretório e, na instrução, defina AllowOverride All

Matt Simmons
fonte
Então, vou precisar de um .htaccess para cada pasta de nível 2 °? mmh .. pode ser uma solução .. seria melhor com 1 Htacces ..
Strae
0

Você pode usar ACLs do Linux .

Alakdae
fonte
Não é que as permissões de arquivo simples? como rwx? Como posso fazer o que preciso com isso?
Strae
0

Depois de ler todos vocês, notei que o arquivo .htaccess pode ser o caminho para mim: afeta apenas os arquivos da pasta em que está.

Mas minhas pastas são geradas dinamicamente. Eu não acho que copiar o arquivo .htaccess ou recriá-lo toda vez que eu criar uma nova pasta é uma maneira confiável.

Como Dave disse, o caminho lógico deve ser armazenar os arquivos de texto de configuração fora da pasta acessível pela web.

Mas em todas as pastas eu tenho que armazenar outros arquivos, imagens, por exemplo, que devem estar acessíveis na Web ... e ainda não acho que replicar a estrutura das pastas, dentro e fora do diretório raiz da Web, também seja uma maneira confiável. . Portanto, precisarei alterar até a configuração do apache para incluir a pasta config no caminho permitido pelo php. Isso não deve ser um problema.

Então, se eu não tenho o melhor , tenho que escolher o menos pior .

Vou usar a solução de vários arquivos .htaccess, por enquanto, esperando não ter arrependimentos no futuro.

Todas as outras soluções são apreciadas.

Strae
fonte
0

Na seção Documentação do pedido :

As palavras-chave podem ser separadas apenas por vírgula; nenhum espaço em branco é permitido entre eles.

Portanto, o seguinte está incorreto:

<Files File.txt>
Order allow, deny
Deny from all
</ Files>

A seguir está (mais) correto

<Files "File.txt">
Order allow,deny
Deny from all
</Files>
ebichuhamster
fonte