Situação atual: PHP2Shell. Duas vulnerabilidades críticas do PHP (CVSS 9,2) permitem executar código malicioso sem autenticação. Patches disponíveis desde 21/10/2026.O que fazer agora →

expose_php e cabeçalhos Server: ocultar a versão

O PHP, o Nginx e o Apache indicam por defeito o número da versão em cada resposta. Isso não protege contra ataques, mas dá aos scanners uma lista cómoda de alvos. Como desativar e manter, ainda assim, a visão geral.

Atualizado em 6 min de leituraHardening e configuração

Em resumo: Com expose_php = Off no php.ini, desaparece o cabeçalho X-Powered-By: PHP/…. A isto juntam-se server_tokens off; no Nginx e ServerTokens Prod e ServerSignature Off no Apache. Isto não torna nenhum servidor mais seguro, mas retira às análises automatizadas uma lista de versões já pronta. O seu próprio nível de patches verifica-o depois através do gestor de pacotes e dos processos, não através de cabeçalhos.

O cartão de visita em cada resposta

Quem, depois de 21 de outubro de 2026, quisesse saber quantos servidores ainda mostram uma versão antiga do PHP não precisava de procurar muito. Muitos servidores web indicam a sua versão do PHP em cada resposta, por exemplo como X-Powered-By: PHP/8.2.20. Os serviços de pesquisa à escala da Internet leem estas indicações, e a Unit 42 da Palo Alto Networks contou, para o PHP2Shell, mais de 22,6 milhões de instâncias expostas e potencialmente vulneráveis.

Para os atacantes, uma indicação destas é um atalho. Podem pré-ordenar alvos em vez de tentar às cegas. Para os operadores, pelo contrário, é inútil, pois nem sequer comprova o próprio nível de patches: as distribuições entregam muitas vezes correções como backport sem novo número de versão.

Este artigo mostra onde o PHP e os servidores web revelam informação de versão e como desativar essas indicações. Diz também com franqueza o que isso traz e o que não traz.

Onde aparecem as indicações de versão

A versão do PHP é apenas um dos vários locais. Vale a pena uma visão completa, porque um único local esquecido desvaloriza as outras medidas.

Local Exemplo Desativar através de
Cabeçalho HTTP do PHP X-Powered-By: PHP/8.3.x expose_php = Off no php.ini
Cabeçalho HTTP do servidor web Server: nginx/1.x ou Server: Apache/2.4.x (Debian) server_tokens off; ou ServerTokens Prod
Páginas de erro do servidor web linha de versão sob as páginas 404 ou 500 as mesmas definições; no Apache, adicionalmente ServerSignature Off
Cabeçalho da aplicação indicações X-Powered-By próprias de frameworks fastcgi_hide_header ou Header unset
Ficheiros na raiz web ficheiros de teste com phpinfo(), ficheiros readme e changelog eliminar ou bloquear
Mensagens de erro do PHP caminhos e pormenores de versão no navegador display_errors = Off

Os ficheiros de teste com phpinfo() são, aqui, a fonte mais rica para os atacantes. Revelam não só a versão, mas toda a configuração; mais informação no artigo Ficheiros phpinfo(): por que têm de desaparecer.

Desativar o expose_php no php.ini

Segundo o manual do PHP, o expose_php está ativado por defeito e só pode ser alterado no php.ini, não no pool, não através do .htaccess e não em tempo de execução. Defina por isso o valor no php.ini de cada modo de operação que entrega sites, ou seja, no Debian e no Ubuntu, por exemplo, em /etc/php/<versão>/fpm/ e, se for caso disso, em /etc/php/<versão>/apache2/.

; php.ini da SAPI web, reiniciar depois o PHP-FPM ou o Apache
expose_php = Off

Se várias versões do PHP correrem em paralelo, cada uma precisa da sua entrada. Um reinício do respetivo serviço é obrigatório, porque o PHP só lê o php.ini no arranque.

Encurtar os cabeçalhos Server no Nginx e no Apache

O Nginx indica por defeito a sua versão no cabeçalho Server e nas páginas de erro. Com server_tokens off; fica apenas o nome do produto. Além disso, um cabeçalho X-Powered-By que a própria aplicação define pode ser filtrado com fastcgi_hide_header. Segundo a documentação do Nginx, o Nginx oculta por si só apenas Status e X-Accel-…, não X-Powered-By.

# no bloco http, aplica-se a todos os sites
server_tokens off;
fastcgi_hide_header X-Powered-By;

No Apache, o ServerTokens controla o cabeçalho Server e, ao mesmo tempo, a linha de versão sob as páginas de erro. Segundo a documentação do Apache, a definição só se aplica a todo o servidor, não por VirtualHost. Como as respostas do PHP-FPM através do mod_proxy_fcgi vão parar a uma tabela de cabeçalhos diferente da das respostas do próprio servidor, defina a remoção em ambas as variantes.

# configuração para todo o servidor, p. ex. /etc/apache2/conf-available/security.conf
ServerTokens Prod
ServerSignature Off

# requer mod_headers
<IfModule mod_headers.c>
    Header unset X-Powered-By
    Header always unset X-Powered-By
</IfModule>

Antes de recarregar, verifique a configuração com nginx -t ou apachectl configtest. Como ativar, através de cabeçalhos, proteção para os visitantes, por exemplo com HSTS ou uma Content-Security-Policy, é descrito no guia Cabeçalhos de segurança para sites.

Como verificar o resultado a partir de fora

Depois da alteração, verifique cada domínio individualmente, se possível também uma página de erro. Os comandos seguintes enviam apenas pedidos normais aos seus próprios sites:

# Cabeçalhos da página inicial
curl -sI https://www.example.de/ | grep -iE '^(server|x-powered-by):'
# Cabeçalhos de uma página inexistente
curl -sI https://www.example.de/gibt-es-nicht-4711 | grep -iE '^(server|x-powered-by):'

Espera-se um cabeçalho Server sem número de versão e nenhum X-Powered-By. Se continuar a aparecer uma versão do PHP, em regra está ativo outro php.ini ou um serviço ainda não foi reiniciado. Se houver uma CDN à frente do servidor, verifique adicionalmente o servidor de origem diretamente, na medida em que seja acessível.

Dica

Mantenha, ainda assim, a versão do PHP registada internamente: no seu inventário de servidores, com o estado dos pacotes e a data da última verificação. O nível de patches comprova-se através do servidor, como descrito em Verificar corretamente a versão do PHP e o nível de patches.

O que ocultar traz e o que não traz

Avaliado com honestidade, desativar as indicações de versão é uma medida pequena, de esforço reduzido. Reduz a probabilidade de aparecer em pesquisas dirigidas a determinadas versões e diminui a informação que um atacante obtém sem esforço.

Mas não protege contra ataques automatizados que enviam simplesmente os seus pedidos a todos os servidores acessíveis. Como decorrem essas análises em massa é descrito no artigo Análises em massa ao PHP sem patch. Contra o PHP2Shell, só ajuda a atualização para PHP 8.5.12, 8.4.27, 8.3.36 ou 8.2.35, ou um backport confirmado, seguida do reinício de todos os processos PHP.

Um efeito secundário é, em contrapartida, muito útil: quem desativa para o exterior as indicações de versão tem de registar as suas versões internamente de forma limpa. Numa situação como o PHP2Shell, é precisamente essa visão geral que decide a rapidez com que se sabe que servidores estão afetados.

Ocultar faz por isso sentido como parte de um reforço de base, não como medida isolada. Pertence à mesma lista de verificação que as saídas de erro desativadas, os ficheiros de teste eliminados e os valores de configuração bloqueados.

Como ajuda concretamente a PHP SOS?

  • Registar os locais: verificamos cabeçalhos, páginas de erro e raiz web de todos os domínios quanto a indicações de versão e ficheiros de teste esquecidos.
  • Adaptar a configuração: definimos expose_php, cabeçalhos Server e filtros de cabeçalhos em cada versão do PHP e em cada servidor web e reiniciamos os serviços de forma controlada.
  • Comprovar internamente o nível de patches: documentamos versões e estados de pacotes onde pertencem, no inventário e não no cabeçalho HTTP.
  • Integrar no reforço de segurança: a medida faz parte do nosso reforço de segurança de servidores para servidores web PHP.

Perguntas frequentes

O expose_php = Off torna o meu servidor seguro?

Não. A definição apenas remove a indicação da versão do cabeçalho HTTP. Uma versão vulnerável do PHP continua vulnerável e os ataques automatizados tentam muitas vezes os seus pedidos, de qualquer forma, em todos os servidores acessíveis. Mas retira aos atacantes uma pré-seleção fácil e reduz a visibilidade nos motores de busca de servidores.

Posso definir o expose_php no pool FPM ou através do .htaccess?

Segundo o manual do PHP, o expose_php só pode ser alterado no php.ini. Por isso, defina o valor no php.ini de cada SAPI web e reinicie depois o PHP-FPM ou o Apache.

Por que vejo X-Powered-By apesar de expose_php = Off?

Nesse caso, em regra é a própria aplicação ou uma framework que define o cabeçalho, ou está ativo outro php.ini. Remova o cabeçalho adicionalmente no servidor web: com fastcgi_hide_header no Nginx ou Header unset no Apache.

Como verifico o meu nível de patches se a versão deixar de ser visível?

Através do próprio servidor: gestor de pacotes, changelog do pacote com os números CVE e hora de arranque dos processos PHP. A indicação no cabeçalho HTTP nunca foi uma prova, porque as distribuições aplicam muitas vezes backports sem novo número de versão.

Fontes

Contacto imediato

Cada hora conta. Escreva-nos agora.

Descreva brevemente o sistema, a versão do PHP e o que observou. Entramos em contacto consigo, esclarecemos a situação e trabalhamos remotamente até o incidente estar concluído e documentado.

Ajuda imediata