Como funciona esta verificação
O Scanaris lê os cabeçalhos da resposta principal da tua página e olha para dois em concreto. Se existir X-Powered-By com qualquer valor (por exemplo Express, PHP/8.2.12 ou Next.js), abre um achado de severidade baixa. Se existir Server e o valor contiver um número de versão (algo como nginx/1.18.0 ou Apache/2.4.57), abre outro. Um Server: nginx ou Server: cloudflare sem mais não é marcado: dizer que servidor usas não é problema; dizer exatamente que versão, é.
Porque importa
Nenhum destes cabeçalhos serve para alguma coisa ao utilizador ou ao browser. Existem por hábito. O que fazem é poupar trabalho a quem procura uma vulnerabilidade: com PHP/7.4.3 ou Apache/2.4.49 na resposta, o atacante não tem de adivinhar nada, vai direto à lista de falhas conhecidas dessa versão e testa as que têm exploit público. É um achado de severidade baixa porque, por si só, não abre porta nenhuma; mas é dos mais fáceis de fechar, e os scanners em massa filtram os alvos exatamente por estes cabeçalhos.
Como removê-los conforme a tua stack
- Express:
app.disable('x-powered-by')ao criar a app, ou usahelmet(), que o remove juntamente com outras melhorias. - Next.js: envia
X-Powered-By: Next.jspor defeito. Emnext.config.js,poweredByHeader: false. - PHP: em
php.ini,expose_php = Off. Em alojamento partilhado costuma poder mudar-se no painel ou com um.user.ini. - ASP.NET: em
web.config, dentro decustomHeaders,<remove name="X-Powered-By" />, e no IIS desativa também o cabeçalhoX-AspNet-VersioncomenableVersionHeader="false". - nginx:
server_tokens off;no blocohttp. Continua a dizer "nginx", mas sem versão. - Apache:
ServerTokens ProdeServerSignature Offna configuração principal. ComProdo cabeçalho fica sóApache. - Vercel, Netlify, Cloudflare Pages: não enviam versão em
Server. Se viresX-Powered-Byaí, vem da tua framework (Next.js ou Express), não da plataforma.
Se tens um proxy ou CDN à frente (Cloudflare, um balanceador), verifica a resposta pública: às vezes o proxy substitui o cabeçalho Server e o problema desaparece sozinho, mas o X-Powered-By costuma passar intacto.
Confirma que está corrigido
curl -sI https://teudominio.com | grep -iE "^(server|x-powered-by):"
O ideal é que não apareça X-Powered-By e que Server, se aparecer, não leve número. Testa também uma rota da API ou uma página de erro (um URL que não exista): os erros por vezes são gerados noutra camada que volta a adicionar o cabeçalho.
Perguntas frequentes
Esconder a versão não corrige a vulnerabilidade. Para que serve?
Para não estares na primeira página de resultados de quem procura vítimas. Tens razão em que a solução de fundo é atualizar: esconder a versão é o complemento, não o substituto. As duas coisas juntas custam cinco minutos.
O meu alojamento não me deixa mexer na configuração do servidor.
Nesse caso, elimina pelo menos o X-Powered-By a partir do teu código ou do teu .htaccess (Header unset X-Powered-By) e pede ao alojamento que esconda a versão. Os outros cabeçalhos de segurança, os que deves mesmo ter, são revistos pela verificação de cabeçalhos de segurança.
Porque é que "Server: cloudflare" não é marcado?
Porque não revela nada aproveitável: nem versão nem software concreto por trás. O que se procura aqui é informação que encurte o caminho até um exploit. Que cabeçalhos convém ter e quais sobram, conta-o cabeçalhos HTTP explicados para humanos.