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

Publicado por Buckminster em 30/05/2023

[ Hits: 2.031 ]

 


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

Quantidade de caracteres suportados na barra de endereços dos navegadores

GRUB com senha criptografada no Debian Squeeze

Bloquear P2P no IPtables

Instalar PHP8 no Debian 9 e 10

Como resolver os erros 'a start job is running for wait for network to be configured' e 'a start job is running for raise network interfaces'

Leitura recomendada

Autenticação e criptografia de senhas usando PHP

phpMD5raptor

Zoneminder com acesso restrito por usuário não mostra imagem da câmera de vídeo

Armazenamento Criptografado em PHP

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

  

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