Situación actual: PHP2Shell. Dos vulnerabilidades críticas de PHP (CVSS 9.2) permiten ejecutar código malicioso sin autenticación. Parches desde el 21/10/2026.Qué hacer ahora →

Actualizar PHP en Windows

En Windows no hay actualización automática de PHP. Quien elige la variante correcta, verifica la descarga y reinicia todos los procesos lleva el parche de PHP2Shell limpiamente a cada equipo.

Actualizado 7 min de lecturaHosting y distribuciones

En resumen: En Windows se actualiza PHP a mano: descargar de php.net la versión corregida, elegir la misma variante (Thread Safe o Non Thread Safe) y arquitectura, verificar la descarga con SHA-256, conservar php.ini y las extensiones, cambiar la ruta y reiniciar todos los procesos de PHP. La actualización es especialmente urgente si Apache en Windows carga PHP como módulo, porque el equipo de PHP clasifica este modo de funcionamiento como el más alto en PHP2Shell.

Dónde se esconde PHP en los equipos Windows

Los servidores Windows con PHP son más frecuentes de lo que muchos piensan. Rara vez es el gran sitio web; a menudo son intranets, aplicaciones especializadas o herramientas que alguien instaló hace años. El funcionamiento bajo IIS está descrito con detalle en la página Proteger PHP en Windows e IIS. Este artículo trata de la propia actualización y de los casos ajenos a IIS.

Los lugares típicos son Apache para Windows con PHP como módulo, paquetes de desarrollo como XAMPP, WampServer o Laragon que han acabado en un servidor, copias propias de PHP en aplicaciones especializadas y scripts PHP en tareas programadas. Los siguientes comandos de PowerShell solo leen y ayudan a encontrarlos:

# Encontrar todos los php.exe en la unidad C: (tarda algo en unidades grandes)
Get-ChildItem -Path C:\ -Filter php.exe -Recurse -ErrorAction SilentlyContinue |
  Select-Object FullName, LastWriteTime

# ¿Qué php.exe está en la ruta de búsqueda?
where.exe php

# Procesos de PHP y Apache en ejecución con ruta y hora de inicio
Get-Process php*, httpd -ErrorAction SilentlyContinue | Select-Object Name, Id, StartTime, Path

# Versión y configuración cargada de una instalación (ruta como ejemplo)
& "C:\PHP\8.4\php.exe" -v
& "C:\PHP\8.4\php.exe" --ini

Importante: si PHP funciona como módulo de Apache, no hay un proceso de PHP propio. PHP está entonces dentro del proceso httpd.exe. Quien busca solo procesos php-cgi pasa por alto estas instalaciones.

También se olvidan con facilidad las tareas programadas que llaman a scripts PHP, por ejemplo para importaciones, informes o conciliaciones de datos. A menudo usan un php.exe propio y más antiguo. Para PHP2Shell se consideran menos expuestas, porque según los datos de php.net hasta ahora la línea de comandos no figura entre los modos de funcionamiento afectados; al sustituirlo deben apuntar igualmente a la nueva ruta, o la instalación antigua seguirá en uso y nunca se eliminará.

# Tareas programadas que llaman a PHP
Get-ScheduledTask | Where-Object { $_.Actions.Execute -match 'php' } |
  Select-Object TaskName, TaskPath, @{n='Programm';e={$_.Actions.Execute}}

Un tema aparte son los equipos de desarrollo. XAMPP y paquetes similares arrancan Apache con PHP como módulo y a menudo son accesibles en toda la red de la empresa. También ahí hay que actualizar PHP, y el servidor web solo debería escuchar en el propio equipo.

Thread Safe o Non Thread Safe: la variante correcta

php.net ofrece cada versión de Windows en varias variantes. Para la sustitución vale: la misma variante y arquitectura que hasta ahora; de lo contrario, el servidor web o las extensiones no cargan.

Característica Opciones Cuándo cuál
Seguridad de hilos NTS (Non Thread Safe), TS (Thread Safe) según php.net, NTS para FastCGI, por ejemplo IIS, y línea de comandos; TS para PHP como módulo en Apache
Arquitectura x64, x86 php.net recomienda x64
Compilador VS16, VS17 requiere el Visual C++ Redistributable para Visual Studio 2015 a 2022

Para PHP 8.5, php.net listaba en la consulta del 25 de octubre de 2026 la versión 8.5.12 del 21 de octubre de 2026, como archivo ZIP en las cuatro combinaciones. Las demás ramas compatibles las elige en la misma página. Están corregidas 8.5.12, 8.4.27, 8.3.36 y 8.2.35. Para 8.1 y anteriores ya no hay actualizaciones oficiales.

Actualización de PHP en Windows: verificar la descarga y sustituir limpiamente

  1. Descargar la versión corregida: de la página de descargas de Windows en php.net, acorde a variante y arquitectura.
  2. Comparar la suma de comprobación: php.net indica para cada archivo un valor SHA-256. Si difiere, no use el archivo.
  3. Descomprimir en una carpeta nueva: por ejemplo C:\PHP\8.4.27, para conservar el nivel antiguo como vía de retorno.
  4. Conservar la configuración: copiar el php.ini actual y compararlo con el nuevo php.ini-production.
  5. Revisar las extensiones: los archivos DLL adicionales de terceros deben coincidir con versión, variante y arquitectura.
  6. Cambiar la ruta: en la entrada de FastCGI, en la línea LoadModule de Apache o en la variable de entorno PATH.
  7. Reiniciar y comprobar: reiniciar el servicio del servidor web y las tareas programadas, y después controlar la versión y las horas de inicio.
# Calcular el SHA-256 del archivo descargado y compararlo con php.net
Get-FileHash .\php-8.5.12-nts-Win32-vs17-x64.zip -Algorithm SHA256

# Tras el cambio: extensiones cargadas y versión de la nueva instalación
& "C:\PHP\8.5.12\php.exe" -m
& "C:\PHP\8.5.12\php.exe" -v

Si PHP no arranca tras el cambio o informa de una DLL ausente, a menudo falta el Visual C++ Redistributable en la arquitectura adecuada, o una extensión no encaja con la versión nueva. El error se ve más rápido si ejecuta php.exe -v directamente en la línea de comandos antes de cambiar el servidor web. Qué efecto tiene cada entrada de php.ini lo explica php.ini explicado.

Apache en Windows: tomarse en serio el modo módulo

Muchas instalaciones antiguas de Windows integran PHP directamente en Apache mediante una línea LoadModule. Técnicamente es lo mismo que mod_php en Linux. El equipo de PHP clasifica el riesgo de PHP2Shell como el más alto justo ahí, porque se demostró un exploit antes de que se ejecute siquiera código de la aplicación. Los antecedentes figuran en Por qué mod_php está especialmente expuesto.

Qué módulos carga un Apache lo muestra httpd.exe -M en la carpeta bin de la instalación; el comando solo lee. Si allí figura un módulo de PHP, la actualización tiene prioridad. A medio plazo compensa pasar a PHP mediante FastCGI con build NTS, para que PHP funcione en procesos propios. Eso exige una prueba, porque cambian la configuración y los permisos.

Importante

Sustituir los archivos todavía no cierra la vulnerabilidad. Mientras el servicio de Apache, los grupos de aplicaciones de IIS o las tareas programadas funcionen con la versión antigua, la vulnerabilidad sigue abierta. Compruebe la hora de inicio de cada proceso tras la actualización.

Tras la actualización: control y huellas

Anote para cada instalación la ruta, la versión, la variante y la fecha del cambio. Elimine las carpetas antiguas de PHP solo cuando el nivel nuevo funcione de forma estable, y entonces elimínelas de verdad, para que no vuelvan a integrarse por error.

Una actualización no elimina el software malicioso. Si un servidor Windows era accesible desde Internet en los días anteriores al parche, revise en los directorios web los archivos de script nuevos, y en las tareas programadas y las cuentas locales cualquier elemento desconocido, y asegure los registros del servidor web desde el 20 de octubre. Cómo reconocer una intrusión lo describe ¿Ya estoy comprometido?.

¿Cómo ayuda PHP SOS en concreto?

  • Encontrar todas las instalaciones: buscamos PHP en sus sistemas Windows, también en módulos de Apache, paquetes de desarrollo y aplicaciones especializadas.
  • Sustituir y acreditar: mediante el servicio de parcheo de PHP cambiamos a la versión corregida, verificamos las sumas de comprobación y documentamos la versión y el inicio de los procesos.
  • Mejorar el modo de funcionamiento: donde PHP funciona como módulo de Apache, planificamos y probamos el paso a FastCGI.
  • Revisar las huellas: aseguramos los registros y examinamos los sistemas en busca de indicios de un ataque.

Preguntas frecuentes

¿Actualiza Windows Update también PHP?

No. PHP no forma parte de Windows. Llega como archivo ZIP de php.net, como parte de un paquete como XAMPP o con una aplicación especializada, y debe actualizarse por ese mismo camino.

¿Necesito la versión Thread Safe o la Non-Thread-Safe?

Según php.net, NTS está pensada para FastCGI, es decir, por ejemplo para IIS, y para la línea de comandos. TS está pensada para el funcionamiento como módulo en el servidor web, por ejemplo en Apache. En la actualización, use la misma variante que hasta ahora.

¿Cómo compruebo que la descarga de PHP es auténtica?

php.net indica para cada archivo de Windows una suma de comprobación SHA-256. Con Get-FileHash en PowerShell calcula la suma del archivo descargado y compara ambos valores carácter por carácter.

Uso XAMPP en un servidor. ¿Qué hago ahora?

Paquetes como XAMPP traen su propio PHP y Apache, a menudo con PHP como módulo de Apache. Compruebe si el proyecto ofrece una versión con PHP corregido y, si no, pase la instalación a una solución mantenida. Para la explotación productiva, estos paquetes de desarrollo no están pensados de todos modos.

Fuentes

Contacto inmediato

Cada hora cuenta. Escríbanos ahora.

Describa brevemente el sistema, la versión de PHP y lo que ha observado. Nos pondremos en contacto, aclararemos la situación y trabajaremos en remoto hasta que el incidente quede cerrado y documentado.

Ayuda inmediata