XAMPP e EasyPHP na rede do escritório: o colega vê o site e o phpMyAdmin aberto
Descubra o que o seu ambiente PHP local expõe na rede, feche MySQL e phpMyAdmin, libere só o necessário e saiba quando montar um ambiente de homologação de verdade.
Você configura o XAMPP para o colega testar o sistema de pedidos pelo navegador dele: basta abrir http://192.168.0.15/pedidos. Funciona. O que você não contou é que http://192.168.0.15/phpmyadmin também abre, sem pedir senha, com a cópia da base de clientes que você trouxe da produção "só para testar". Qualquer pessoa no Wi-Fi do escritório, inclusive visitantes, chega lá.
A resposta curta: pacotes como XAMPP e EasyPHP vêm configurados para conveniência numa máquina só, não para uma rede compartilhada. Antes de abrir para a rede, descubra o que está escutando em todas as interfaces, prenda o MySQL e o phpMyAdmin ao localhost, ponha senha no root, libere só a pasta do projeto para a faixa de IPs do escritório e use dados fictícios. Para mostrar a alguém de fora, monte um ambiente de homologação com HTTPS, não abra o seu notebook.
Por que o ambiente local vira porta aberta
Ambientes de desenvolvimento priorizam "funcionar no primeiro clique". Por isso é comum o MySQL (ou MariaDB, no XAMPP) vir com o usuário root sem senha e o phpMyAdmin configurado para entrar direto, sem tela de login. Numa máquina isolada, o risco é pequeno. O problema começa quando o Apache ou o MySQL escutam em 0.0.0.0, que significa "todas as interfaces de rede", e o firewall deixa passar.
A rede do escritório não é a sua casa. Tem colegas, prestadores, visitantes no Wi-Fi, impressoras e câmeras com firmware antigo. Qualquer dispositivo comprometido nessa rede enxerga o seu notebook. E a base copiada da produção carrega nome, CPF e telefone de clientes reais, o que transforma um descuido de configuração num incidente de dados pessoais.
Como deixar o ambiente local seguro para mostrar na rede
- Veja o que está escutando. No PowerShell, liste as portas abertas do Apache e do banco. Endereço local
0.0.0.0ou::significa aberto para a rede;127.0.0.1significa só a sua máquina. - Prenda o banco ao localhost. O PHP roda na mesma máquina e não precisa que a porta 3306 seja alcançável de fora.
- Ponha senha no root e crie um usuário só para o projeto. A aplicação conecta com esse usuário, com permissão só na base do projeto.
- Tire o login automático do phpMyAdmin e restrinja o acesso a ele ao próprio computador.
- Libere só a pasta do projeto para a rede do escritório, por faixa de IP, e nada mais do
htdocs. - Troque os dados reais por fictícios. Gere clientes de teste; se precisar de volume, gere volume falso.
- Teste de outra máquina, não do seu navegador.
Exemplo: fechando o XAMPP do notebook 192.168.0.15
Primeiro, o diagnóstico no PowerShell:
Get-NetTCPConnection -State Listen |
Where-Object LocalPort -in 80, 443, 3306 |
Select-Object LocalAddress, LocalPort, OwningProcess
# Saída antes do ajuste:
# LocalAddress LocalPort OwningProcess
# 0.0.0.0 80 4120 (httpd)
# 0.0.0.0 3306 5876 (mysqld)
No arquivo my.ini do MySQL/MariaDB do pacote, na seção [mysqld], prenda o banco ao localhost e reinicie o serviço pelo painel:
[mysqld]
bind-address = 127.0.0.1
Agora, a senha. Se o comando abaixo entra sem pedir nada, o root está sem senha:
mysql -u root
-- dentro do cliente:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'uma-senha-longa-gerada-no-gerenciador';
CREATE USER 'pedidos_dev'@'localhost' IDENTIFIED BY 'outra-senha-longa';
CREATE DATABASE pedidos_dev CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON pedidos_dev.* TO 'pedidos_dev'@'localhost';
No config.inc.php do phpMyAdmin, troque a autenticação automática pela tela de login. O modo cookie exige uma chave de 32 caracteres em blowfish_secret:
$cfg['blowfish_secret'] = 'troque-por-32-caracteres-aleatorios';
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['AllowNoPassword'] = false;
No Apache, deixe o phpMyAdmin só para a própria máquina e o projeto só para a faixa do escritório. Versões recentes de alguns pacotes já trazem a primeira regra; confira no arquivo de configuração do pacote em vez de presumir:
<Directory "C:/xampp/phpMyAdmin">
Require local
</Directory>
<Directory "C:/xampp/htdocs">
Require local
</Directory>
<Directory "C:/xampp/htdocs/pedidos">
Require local
Require ip 192.168.0.0/24
</Directory>
Por fim, o teste de outra máquina do escritório:
Test-NetConnection 192.168.0.15 -Port 3306 # esperado: TcpTestSucceeded : False
curl.exe -I http://192.168.0.15/phpmyadmin/ # esperado: 403 Forbidden
curl.exe -I http://192.168.0.15/pedidos/ # esperado: 200 OK
O firewall do Windows e o perfil da rede
Na primeira vez que o Apache escuta na rede, o Windows pergunta se permite o acesso em redes privadas e públicas. Muita gente clica em "Permitir" nas duas. Confira o perfil da rede atual com Get-NetConnectionProfile e mantenha a regra do Apache só no perfil privado; em Wi-Fi de café ou de aeroporto, o notebook não deve aceitar conexão nenhuma.
Servidor embutido do PHP
Se você usa o servidor de desenvolvimento do próprio PHP, o endereço passado decide quem acessa: php -S 127.0.0.1:8000 -t public fica só na sua máquina; php -S 0.0.0.0:8000 abre para a rede. Esse servidor é feito para desenvolvimento, não para atender ninguém além de você e, no máximo, de um colega na mesma sala.
Quando o ambiente local não serve mais
Mostrar o sistema ao cliente, a um sócio remoto ou a um testador de outra empresa pede um ambiente de homologação: um servidor separado, com HTTPS, base fictícia, senha forte e nenhum acesso público ao painel do banco. O risco do painel do banco exposto na internet é ainda maior, e está em phpMyAdmin na URL pública é o banco com uma porta a mais. Se o banco precisa ficar em outra máquina, siga MySQL em outro servidor em vez de abrir a porta 3306 para a rede toda. E, para dados pessoais em ambiente de teste, vale o roteiro de adequação à LGPD num sistema pequeno.
Erros comuns
- Abrir o Apache para a rede sem olhar o MySQL. A porta 3306 escuta em todas as interfaces e aceita o root sem senha de qualquer máquina.
- Deixar o phpMyAdmin com login automático. Quem descobre o endereço administra o banco, apaga tabelas e exporta clientes.
- Copiar a base de produção para o notebook. O vazamento de um ambiente de teste é um vazamento de dados reais, com as mesmas consequências.
- Apontar o
DocumentRootpara a pasta inteira de projetos. Arquivos.env, backups.sqle projetos de outros clientes ficam acessíveis pelo navegador. - Permitir o Apache em redes públicas no firewall. No Wi-Fi do aeroporto, o seu ambiente de testes vira servidor para desconhecidos.
- Testar só do próprio navegador. Do
localhosttudo parece certo; o problema só aparece de outra máquina.
Checklist
- A porta 3306 escuta só em
127.0.0.1. - O root do banco tem senha, e a aplicação usa um usuário próprio com acesso só à base do projeto.
- O phpMyAdmin pede login e responde 403 quando acessado de outra máquina.
- Só a pasta do projeto é liberada para a rede, por faixa de IP.
- A base local tem só dados fictícios.
- A regra do firewall para o Apache vale só no perfil de rede privada.
- Para quem está fora do escritório, existe um ambiente de homologação com HTTPS.
Pegue o celular, conecte no Wi-Fi do escritório e digite o IP do seu notebook seguido de /phpmyadmin: a tela abre sem pedir senha?
Referência: http://forum.imasters.com.br/topic/275215-configurar-easyphp-na-rede-local/