Impedir Acesso a Diretórios Web no Apache

Um desenvolvedor web (estou estudando para isso) precisa ter alguns cuidados ao montar seu sistema, um deles é impedir o acesso direto a pastas.

Exemplo: http://www.algumacoisa.com.br/html/policy.html.

O usuário pode visualizar a página policy.html mas não pode apagar o nome do arquivo para ter acesso ao diretório, ou seja, ele não pode abrir o diretório html se digitar, nesse caso, http://www.algumacoisa.com.br/html.

Abaixo, segue o tutorial de uma alternativa simples que usa PHP.

Atenção: a responsabilidade por qualquer ação feita em seu sistema é só sua! Na dúvida, não faça nada.

1ª Parte

Inicialmente, criaremos dois arquivos index. Serão eles que conterão as instruções do que se quer fazer quando alguém tentar abrir a pasta diretamente.

INDEX.PHP

if (eregi("index.php", $_SERVER['SCRIPT_NAME'])) {
echo ("alert(‘Erro!’)”);
die(“-html–META HTTP-EQUIV=’refresh’CONTENT=’1;URL=/erro404/index.html’–/html-“);
}

Você deve salvar este index.php em todas as pastas que quiser ocultar do acesso público.

INDEX.HTML

-html-
-title-Erro-/title-
-head-
-style=”text/css”-
html, body {
margin:0;
padding:0;
width:100%;
height:100%;
overflow:hidden;
font-family:Times;
font-size:76%;
}
#background{
position:absolute;
z-index:1;
width:100%;
height:100%;
}
#scroller {
position:absolute;
width:100%;
height:100%;
top:0;
left:0;
overflow:auto;
z-index:2;
}
#content {
padding: 40px 0 0 235px;
color: #fff;
font-size: 13pt;
}
p {
line-height:1.0em;
letter-spacing:0.1em;
}
#content a {
text-decoration: none;
color: #CD0000;
}
#content a:hover {
text-decoration: none;
color: #99f;
}
-style-
-body-
-div-
-img src=”/erro/erro3.jpg” alt=”” title=”” /-
-/div-
-div id=”scroller”-
-div id=”content”-
-p-A página não existe ou você não tem permissão para acessá-la.-/p-
-p-Para a página inicial, clique -a href=”/algumacoisa.com.br/index.php”-aqui-/a-
-/p–/div-
-/div-
-body-
-html-

-script type=”text/javascript” window.setTimeout(‘history.back();’, 3000); -/script-

Você deve salvar essa página em uma pasta que, necessáriamente, deve ficar na raiz do seu sistema, ex: localhost/algumacoisa.com.br/erro/, e o nome da pasta pode ser qualquer um.

O nome index.html também pode ser alterado pois só servirá para isso e você vai apontar para ele no httpd.conf, como veremos agora, na configuração do servidor.

2ª Parte
1) Abra o arquivo httpd.conf (arquivo de configuração do Apache)
2) Insira a linha ErrorDocument 404 /erro/index.html (você só pode alterar a estrutura de diretório e nome do arquivo)
3) Reinicie o Apache

Pronto. Se alguém tentar abrir um diretório que contenha o index.php acima, vai obter um alert (javascript) com a mensagem Erro! e, sem seguida, será direcionado para a página /erro/index.html que o devolverá, automaticamente, para a página anterior e dará um link para a página inicial do site.

No arquivo index.php, você pode apagar o alert e manter o die ou vice-versa. Achei interessante manter para mostrar as opções.

Note que, normalmente, até onde sei, o que se faz é configurar o arquivo .htaccess de cada site. O que eu mostro aqui dá mais trabalho e gera mais processamento mas é mais simples para um iniciante. E funciona!

Lembre-se que este tutorial leva em conta que o servidor é o Apache.

Dúvidas, críticas e sugestões, estou à disposição.

Abraço,
Fábio

Obs: por política de segurança, o WordPress desativa os brackets das tags html então, onde encontrar -palavra-, altere pelo sinal de maior (>) ou menor (<).

Anúncios

6 Respostas para “Impedir Acesso a Diretórios Web no Apache

  1. Então Fábio, não é muito aconselhavel utilizar-se de métodos assim, mais se não tem tu vai tu mesmo kkk … pra esses casos dá até pra quebrar uma galho na hora que o malandro acessar /lib/seguranca/ ou /ib/seguranca/index.php enfim… agora se ele souber pelo menos um arquivo ae já dá uma preocupação, mesmo pequena já que dependendo do script ele não vai fazer nada, a não ser que retorne algo…enfim Parabéns ae pelo post e dá um verificada na função eregi ela tá na lista de Deprecated …flw

    • PHPMan, obrigado por seu comentário.
      Na verdade, eu sei que já não é mais recomendado usar a função eregi e o motivo é exatamente o que você mencionou. Mesmo assim, me parece uma boa prática inicial.
      Hoje em dia tenho visto outras maneiras para bloqueio de acessos diretos como if ( ! defined(‘BASEPATH’)) exit(‘No direct script access allowed’);, utilizado pelo CodeIgniter que é o framework de produção que usamos aqui na empresa.
      Também há como usar o htaccess embora eu não tenha muita famliaridade com essa prática, ainda.
      Enfim, ainda sou iniciante, tenho muito a aprender por isso aprecio seu comentário e agradeço sua atenção.
      Abraço,
      Fábio

  2. Fábio, preciso de uma ajuda, EU li seu posto umas 3 vezes, mas nao consigo implantar isso em uma pagina html. Não é wordpress. Eu fiz a pagina em html e tem uma pasta download nela que as pessoas podem acessar via apache, ou seja, diretamente, eu queria bloquear este tipo de acesso, sem prejudicar os downloads dde usuarios de dentro da pagina, meu website nao tem cadastro, e nao foi feito em php. tem como bloquear este acesso ? como devo proceder ?

    • Cara, não entendi sua dificuldade.
      O procedimento que indiquei impede o acesso direto a um diretório. Se você não inserir o index.php no diretório, ele poderá ser acessado diretamente.
      Se puder passar mais detalhes, tentarei ajudar, na boa.
      Fico no aguardo.

      Abraço,
      Fábio

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s