Configurar PHP/Apache para limitar o acesso externo de arquivos pela URL (barra de endereços)

Publicado por Buckminster em 30/05/2023

[ Hits: 1.810 ]

 


Configurar PHP/Apache para limitar o acesso externo de arquivos pela URL (barra de endereços)



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

Outras dicas deste autor

Firmware Realtek - Ativação na instalação do Debian Squeeze 64 bits

Instalar Google Chrome no Debian e derivados

Dica para bloquear usuários em domínios após X tentativas com o Samba4

Desempacotar pacote debian (.deb), alterá-lo e reempacotar

Desligar Windows remotamente pelo Linux

Leitura recomendada

Alerta para uso de variáveis globais no PHP

Autenticação e criptografia de senhas usando PHP

Verificando upload de arquivos no Linux com phpMussel

Estrutura de recuo PHP/Apache para não acessarem arquivos pela URI (barra de endereços)

PhpSecInfo - relatório de segurança de seu ambiente PHP

  

Comentários
[1] Comentário enviado por maurixnovatrento em 25/06/2023 - 13:42h


dica muito importante.

___________________________________________________________
Conhecimento não se Leva para o Túmulo.
https://github.com/mxnt10



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts