web-dev-qa-db-pt.com

Bloquear o acesso direto a um arquivo através de http, mas permite acesso ao script php

Estou carregando meus arquivos (pdf, doc, flv, etc) em um buffer e os servindo aos meus usuários com um script. Eu preciso do meu script para poder acessar o arquivo, mas não permitir acesso direto a ele. Qual é a melhor maneira de conseguir isso? Devo estar fazendo algo com minhas permissões ou bloqueando o diretório com .htaccess?

68
Brandon G

A maneira mais segura é colocar os arquivos que você quer manter fora do diretório raiz da web, como Damien sugeriu. Isso funciona porque o servidor da Web segue os privilégios do sistema de arquivos local, não seus próprios privilégios.

No entanto, existem muitas empresas de hospedagem que apenas fornecem acesso à raiz da web. Para ainda evitar solicitações HTTP para os arquivos, coloque-os em um diretório sozinhos com um arquivo .htaccess que bloqueie toda a comunicação. Por exemplo,

Order deny,allow
Deny from all

Seu servidor da Web e, portanto, seu idioma do servidor, ainda poderão lê-los porque as permissões locais do diretório permitem que o servidor da Web leia e execute os arquivos.

Felicidades.

88
Sam Bisbee

Foi assim que eu evitei o acesso direto da URL aos meus arquivos ini. Cole o seguinte código no arquivo .htaccess na raiz. (não precisa criar pasta extra)

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

meu arquivo settings.ini está na raiz e, sem esse código, é possível acessar www.mydomain.com/settings.ini

32
Aamir Mahmood

no httpd.conf para bloquear o navegador e acessar o wget para incluir arquivos, especialmente dizer db.inc ou config.inc. Observe que você não pode encadear tipos de arquivos na diretiva, em vez disso, criar várias diretivas de arquivos. 

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

testar sua configuração antes de reiniciar o Apache

service httpd configtest

então (reinício gracioso)

service httpd graceful
2
zzapper

Os arquivos estão no mesmo servidor que o script PHP? Se assim for, apenas mantenha os arquivos fora da raiz da web e certifique-se de que seu script PHP tenha permissões de leitura para onde quer que eles estejam armazenados.

2
Damien Wilson

Se você tiver acesso ao seu arquivo httpd.conf (no ubuntu ele está no diretório/etc/Apache2), você deve adicionar as mesmas linhas que faria ao arquivo .htaccess no diretório específico. Isso é (por exemplo):

ServerName YOURSERVERNAMEHERE
<Directory /var/www/>
AllowOverride None
order deny,allow
Options -Indexes FollowSymLinks
</Directory>

Faça isso para cada diretório que você deseja controlar as informações e você terá um arquivo em um local para gerenciar todo o acesso. É o exemplo acima, eu fiz isso para o diretório raiz,/var/www.

Essa opção pode não estar disponível com hospedagem terceirizada, especialmente hospedagem compartilhada. Mas é uma opção melhor do que adicionar muitos arquivos .htaccess.

1
Sablefoste

Como sobre o script baseado no módulo personalizado .htaccess (como é usado no CodeIgniter)? Eu tentei e funcionou bem em aplicativos CodeIgniter. Alguma idéia de usá-lo em outros aplicativos?

<IfModule authz_core_module>
    Require all denied
</IfModule>
<IfModule !authz_core_module>
    Deny from all
</IfModule>
0
Cosmo Arun

Para evitar arquivos .ini do acesso à web, coloque o seguinte no Apache2.conf

<Files ~ "\.ini$">
Order allow,deny
Deny from all
</Files>
0
Daniel Boakye