Em resumo: No Windows, atualiza o PHP à mão: descarregar do php.net a versão corrigida, escolher a mesma variante (Thread Safe ou Non Thread Safe) e arquitetura, verificar o download por SHA-256, aproveitar o php.ini e as extensões, alterar o caminho e reiniciar todos os processos PHP. A atualização é particularmente urgente quando o Apache no Windows carrega o PHP como módulo, porque a equipa do PHP classifica este modo de operação no PHP2Shell como o de maior risco.
Onde está o PHP em computadores Windows
Há servidores Windows com PHP com mais frequência do que muitos pensam. Raramente é o grande site, muitas vezes são intranets, aplicações especializadas ou ferramentas que alguém configurou há anos. A operação sob IIS está descrita em pormenor na página Proteger o PHP no Windows e no IIS. Este artigo trata da própria atualização e dos casos para além do IIS.
Os locais típicos são o Apache para Windows com o PHP como módulo, pacotes de desenvolvimento como XAMPP, WampServer ou Laragon que foram parar a um servidor, cópias próprias do PHP em aplicações especializadas e scripts PHP em tarefas agendadas. Os comandos PowerShell seguintes só leem e ajudam a encontrar:
# Encontrar todos os php.exe na unidade C: (demora um pouco em unidades grandes)
Get-ChildItem -Path C:\ -Filter php.exe -Recurse -ErrorAction SilentlyContinue |
Select-Object FullName, LastWriteTime
# Que php.exe está no caminho de pesquisa?
where.exe php
# Processos PHP e Apache em execução com caminho e hora de arranque
Get-Process php*, httpd -ErrorAction SilentlyContinue | Select-Object Name, Id, StartTime, Path
# Versão e configuração carregada de uma instalação (caminho como exemplo)
& "C:\PHP\8.4\php.exe" -v
& "C:\PHP\8.4\php.exe" --ini
Importante: se o PHP corre como módulo Apache, não há um processo PHP próprio. O PHP está então no processo httpd.exe. Quem procura apenas processos php-cgi não vê estas instalações.
Também se esquecem facilmente as tarefas agendadas que chamam scripts PHP, por exemplo para importações, relatórios ou reconciliações de dados. Usam muitas vezes um php.exe próprio e mais antigo. Para o PHP2Shell são consideradas menos expostas, porque a linha de comandos, segundo as indicações até agora do php.net, não faz parte dos modos de operação afetados; na troca, têm de qualquer modo apontar para o novo caminho, caso contrário a instalação antiga continua em uso e nunca é removida.
# Tarefas agendadas que chamam o PHP
Get-ScheduledTask | Where-Object { $_.Actions.Execute -match 'php' } |
Select-Object TaskName, TaskPath, @{n='Programm';e={$_.Actions.Execute}}
Um tema à parte são os computadores de desenvolvimento. O XAMPP e pacotes semelhantes iniciam o Apache com o PHP como módulo e são muitas vezes acessíveis em toda a rede da empresa. Também aí o PHP deve ser atualizado, e o servidor web só deve escutar no próprio computador.
Thread Safe ou Non Thread Safe: a variante certa
O php.net oferece cada versão Windows em várias variantes. Para a troca vale: a mesma variante e arquitetura de até agora, caso contrário o servidor web ou as extensões não carregam.
| Característica | Opções | Quando qual |
|---|---|---|
| Segurança de threads | NTS (Non Thread Safe), TS (Thread Safe) | segundo o php.net, NTS para FastCGI, por exemplo IIS, e linha de comandos; TS para o PHP como módulo no Apache |
| Arquitetura | x64, x86 | o php.net recomenda x64 |
| Compilador | VS16, VS17 | requer o Visual C++ Redistributable para Visual Studio 2015 a 2022 |
Para o PHP 8.5, o php.net listava, na consulta de 25/10/2026, a versão 8.5.12 de 21/10/2026, como arquivo ZIP nas quatro combinações. Os restantes ramos suportados escolhe-os na mesma página. Estão corrigidos 8.5.12, 8.4.27, 8.3.36 e 8.2.35. Para a 8.1 e anteriores já não existem atualizações oficiais.
Atualização do PHP no Windows: verificar o download e trocar de forma limpa
- Descarregar a versão corrigida: da página de download Windows do php.net, de acordo com a variante e a arquitetura.
- Comparar a soma de verificação: o php.net indica para cada arquivo um valor SHA-256. Se divergir, não use o ficheiro.
- Extrair para uma nova pasta: por exemplo
C:\PHP\8.4.27, para que o estado antigo fique como caminho de volta. - Aproveitar a configuração: copiar o
php.iniexistente e compará-lo com o novophp.ini-production. - Verificar extensões: ficheiros DLL adicionais de terceiros têm de corresponder à versão, variante e arquitetura.
- Alterar o caminho: na entrada FastCGI, na linha
LoadModuledo Apache ou na variável de ambientePATH. - Reiniciar e verificar: reiniciar o serviço do servidor web e as tarefas agendadas e depois controlar versão e horas de arranque.
# Calcular o SHA-256 do ficheiro descarregado e comparar com o php.net
Get-FileHash .\php-8.5.12-nts-Win32-vs17-x64.zip -Algorithm SHA256
# Depois da troca: extensões carregadas e versão da nova instalação
& "C:\PHP\8.5.12\php.exe" -m
& "C:\PHP\8.5.12\php.exe" -v
Se o PHP não arrancar depois da troca ou comunicar uma DLL em falta, muitas vezes falta o Visual C++ Redistributable na arquitetura adequada, ou uma extensão não corresponde à nova versão. O erro revela-se mais depressa se chamar php.exe -v diretamente na linha de comandos antes de alterar o servidor web. O que fazem as várias entradas do php.ini explica-o O php.ini explicado.
Apache no Windows: levar a sério o modo módulo
Muitas instalações Windows mais antigas ligam o PHP através de uma linha LoadModule diretamente ao Apache. Tecnicamente é o mesmo que o mod_php no Linux. A equipa do PHP classifica o risco do PHP2Shell precisamente aí como o mais elevado, porque foi demonstrado um exploit antes de sequer correr o código da aplicação. Os antecedentes estão em Porque é que o mod_php está particularmente exposto.
Que módulos um Apache carrega mostra-o httpd.exe -M na pasta bin da instalação; o comando só lê. Se aí constar um módulo PHP, a atualização tem prioridade. A médio prazo compensa a mudança para o PHP através de FastCGI com build NTS, para que o PHP corra em processos próprios. Isso exige um teste, porque mudam a configuração e as permissões.
A troca dos ficheiros ainda não fecha a vulnerabilidade. Enquanto o serviço Apache, os pools de aplicações do IIS ou as tarefas agendadas correrem com a versão antiga, a vulnerabilidade continua aberta. Verifique a hora de arranque de cada processo depois da atualização.
Depois da atualização: controlo e vestígios
Registe, por instalação, caminho, versão, variante e data da troca. Remova as pastas PHP antigas só quando o novo estado funcionar de forma estável, e então mesmo, para que não sejam voltadas a ligar por engano.
Uma atualização não remove software malicioso. Se um servidor Windows esteve acessível a partir da Internet nos dias antes do patch, verifique nos diretórios web a existência de novos ficheiros de script e nas tarefas agendadas e contas locais a existência de algo desconhecido, e guarde os registos do servidor web a partir de 20 de outubro. Como reconhece uma intrusão descreve-o Já fui comprometido?.
Como ajuda concretamente a PHP SOS?
- Encontrar todas as instalações: procuramos o PHP nos seus sistemas Windows, também em módulos Apache, pacotes de desenvolvimento e aplicações especializadas.
- Trocar e comprovar: através do serviço de patch PHP, mudamos para a versão corrigida, verificamos somas de verificação e documentamos versão e arranque dos processos.
- Melhorar o modo de operação: onde o PHP corre como módulo Apache, planeamos e testamos a passagem para FastCGI.
- Verificar vestígios: guardamos registos e verificamos os sistemas quanto a indícios de um ataque.
Perguntas frequentes
O Windows Update também atualiza o PHP?
Não. O PHP não faz parte do Windows. Vem como arquivo ZIP do php.net, como parte de um pacote como o XAMPP ou com uma aplicação especializada e tem de ser atualizado por esse mesmo caminho.
Preciso da versão Thread Safe ou Non Thread Safe?
Segundo o php.net, a NTS destina-se ao FastCGI, ou seja, por exemplo ao IIS, e à linha de comandos. A TS destina-se à operação como módulo no servidor web, por exemplo no Apache. Na atualização, use a mesma variante de até agora.
Como verifico se o download do PHP é autêntico?
O php.net indica para cada arquivo Windows uma soma de verificação SHA-256. Com Get-FileHash no PowerShell calcula a soma do ficheiro descarregado e compara os dois valores caráter a caráter.
Uso o XAMPP num servidor. E agora?
Pacotes como o XAMPP trazem o seu próprio PHP e Apache, muitas vezes com o PHP como módulo Apache. Verifique se o projeto oferece uma versão com PHP corrigido e, caso contrário, passe a instalação para uma solução mantida. Para a operação produtiva, estes pacotes de desenvolvimento não se destinam de qualquer modo.