A presente dica serve para limitar que alguém digite o caminho na barra de endereços e tenha acesso às pastas e arquivos restritos.
Faça uma estrutura de recuo com os arquivos e as pastas
1. Crie uma pasta "publica" dentro da pasta do teu site em /var/www:
# mkdir /var/www/meusite
# mkdir /var/www/meusite/publica
Ou dê o nome que quiser.
2. Dentro da pasta pública coloque somente o arquivo index.php. No arquivo index.php você faz um include para um arquivo que você quer chamar de uma pasta privada e daí por diante para todos os outros.
Exemplo de estrutura:
- /var/www/meusite/publica
- /var/www/meusite/privada
- /var/www/meusite/css-js
Nesta estrutura acima você pode acrescentar diretórios (pastas) de acordo com as suas necessidades.
Lembrando que os arquivos css e js obviamente terão acesso externo de qualquer maneira e verão o conteúdo, então, para evitar isso você pode embaralhar o conteúdo, mas não é o escopo da dica.
Executamos os comandos:
Primeiro colocamos o seu usuário no grupo www-data (grupo padrão do Apache):
# adduser usuario www-data
Entramos no diretório /var/www:
# cd /var/www
Depois colocamos o usuário www-data como dono e o /var/www no grupo www-data:
# chown -Rv www-data:www-data /var/www/
E, por fim, atribuímos recursivamente as devidas permissões (rw) ao grupo para o diretório /var/www.
# chmod -Rv g+rw /var/www/
Agora setamos as permissões para o diretório publica:
# chmod -R 744 /var/www/meusite/publica
As permissões acima poderiam ser 644, mas dependendo de alguns sistemas isso dá problemas de acesso, páginas em branco, etc, então teste aí.
Com as configurações feitas acima com o usuário e grupo www-data, as permissões 744 da pasta publica mantêm-se num nível bastante seguro, pois nela terá somente o arquivo index ou um link simbólico para o index.
O diretório /var/www/meusite/publica é o que você colocará no Directory do apache.conf, por exemplo:
<Directory "/var/www/meusite/publica">
Options +SymLinksIfOwnerMatch -Indexes -MultiViews
AllowOverride None
DirectoryIndex index index.py index.php indez.pl
Require all granted
<Files *.php>
Require all denied
Satisfy Any
</Files>
</Directory>
- SymLinksIfOwnerMatch: O servidor seguirá apenas links simbólicos para os quais o arquivo ou diretório de destino pertence ao mesmo id de usuário do link. Se você tem um site HTML simples e nenhuma URL sofisticada pode usar FollowSymLinks, mas o mod_rewrite, que é necessário para regravação de URL exige que se use SymLinksIfOwnerMatch;
- Indexes: Retorna uma listagem formatada do diretório solicitado na URL;
- Multiviews: O servidor faz uma correspondência de padrão de nome de arquivo implícito e escolhe entre os resultados, faz uma negociação de conteúdo. Se o servidor receber uma solicitação para /some/dir/foo e Multiviews estiver habilitada e o arquivo foo em /some/dir/foo não existir, o Apache lê todo o diretório procurando por arquivos de nome foo.
Os sinais de + e - se fazem necessários: + permite e - não permite.
3. No arquivo meusite.conf na pasta sites-available você coloca no VirtualHost o mesmo caminho /var/www/meusite/publica.
4. No php.ini você seta a opção:
allow_url_fopen = Off
Lembrando que na linha "DirectoryIndex index index.py index.php indez.pl" você deve configurar o apache2.conf (ou httpd.conf) para ler outras extensões como sendo php:
AddType application/x-httpd-php .php .htm .html .asp .py .pl .etc
Esta estrutura é ideal para quem tem um servidor próprio em casa ou na empresa ou para VPS porque fornece uma boa segurança. O requisito básico é ter acesso direto ao servidor.
5. Outra sugestão é você colocar adicionalmente target="_blank" no HTML para todos os arquivos que chamem arquivos de login ou de acordo com as suas necessidades, por exemplo, caso o index.php tenha um botão que chame um arquivo de login coloque target="_blank" para abrí-lo em nova página do navegador; ou coloque target="_blank" no botão de login do arquivo de login para abrir a página logado em nova página.
6. Pode também colocar o arquivo index.{php,py,pl} na pasta privada e criar um link simbólico para ele na pasta publica.
# cd /var/www/meusite/publica
# ln -s /var/www/meusite/privada/index.php index
Caso você já tenha seu site todo estruturado em pastas e arquivos pode ser que se tornará trabalhoso mover as pastas e os arquivos para fazer a estrutura de recuo, então, considere somente as configurações aqui apresentadas no Php, no Apache e no Html.
Você pode fazer também configurações no arquivo .htaccess para limitar os acessos externos, porém, eu evito trabalhar com .htaccess e nunca precisei, além disso, o próprio manual do Apache desaconselha o uso de arquivos .htaccess recomendando somente em caso de última necessidade ou quando o administrador do site precisa dar acesso às configurações (um serviço de hospedagem com FTP), apesar de que este último caso pode ser evitado criando-se arquivos .conf em sites-available e setando-se permissões específicas para cada usuário e/ou grupo.
Fora isso, toda e qualquer configuração deve ser feita no apache.conf e no arquivo .conf que você coloca dentro do diretório sites-available.
Tem mais considerações no tocante a essa segurança de acesso externo a arquivos em sites, mas como se trata somente de uma dica simples, fico por aqui e deixo adiante (com o link) o que o Apache diz:
"No geral, você nunca deve usar arquivos .htaccess a não ser que você não tenha acesso ao arquivo de configuração principal do servidor. Existe, por exemplo, um erro de concepção que dita que a autenticação de usuários sempre deve ser feita usando os arquivos .htaccess. Esse simplesmente não é o caso. Você pode usar as configurações de autenticação de usuário no arquivo de configuração principal do servidor, e isso é, de fato, a maneira mais adequada de se fazer as coisas.
Arquivos .htaccess devem ser usados em casos onde os provedores de conteúdo do site precisem fazer mudanças na configuração do servidor por-diretório, mas não tem acesso root ao sistema do servidor. Caso o administrador do servidor não esteja disposto a fazer mudanças freqüentes nas configurações do servidor, é desejável permitir que os usuários possam fazer essas mudanças através de arquivos .htaccess eles mesmos. Isso é particularmente verdade, por exemplo, em casos onde provedores estão fornecendo múltiplos sites para usuários em apenas uma máquina, e querem que seus usuários possam alterar suas configurações.
No entanto, de modo geral, o uso de arquivos .htaccess deve ser evitado quando possível. Quaisquer configurações que você considerar acrescentar em um arquivo .htaccess podem ser efetivamente colocadas em uma seção <Directory> no arquivo principal de configuração de seu servidor."
Fonte:
Apache HTTP Server Tutorial: .htaccess files - Apache HTTP Server Version 2.4