BookinglyTech News
Software

El parche temporal de PHP de 2014 suma 20 millones de instalaciones y ahora se retira

Jake Smith escribió 174 líneas de PHP como apaño para el CMS de AOL. Doce años después las marca como obsoletas y explica por qué no se las cede a nadie.

3 min de lecturaLobsters0 vistas

En 2014, Jake Smith escribió 174 líneas de PHP para tapar un hueco en el CMS de AOL. Las subió a Packagist por si a alguien más le servían. Doce años después, ese paquete acumula casi 20 millones de instalaciones desde el repositorio y sigue sumando más de 400.000 al mes. Smith acaba de marcarlo como obsoleto y lo retira.

El apaño cubría una función concreta, http_build_url(), que llegaba con la versión 1 de la extensión pecl_http. Al migrar AOL su CMS de PHP 5.2 a 5.3, esa extensión desapareció, y el código la llamaba en decenas de sitios. En lugar de tocar todos esos puntos, Smith reimplementó la función y la definió solo si la original no existía. El código antiguo nunca notó el cambio. Composer empezaba a despegar y publicarlo fue trivial. La idea era aguantar un año o dos.

El alcance real

Aguantó mucho más. Composer no es ni la mitad de la historia: WPML, el plugin multilingüe de WordPress, lo empaqueta dentro de su propio código y dice estar en más de 1,5 millones de sitios. La librería de dominios idna-convert depende de él, y por ahí ha acabado dentro del CMS francés SPIP y empaquetado en Debian y Ubuntu. Entre unos y otros, hay bastantes probabilidades de que hayas visitado una web que sigue ejecutando ese código de 2014.

Smith no fue consciente hasta hace unos meses, cuando abrió el paquete por primera vez en años. Ya en 2021, tras salir de PHP, pidió un maintainer nuevo porque las cifras de descargas le parecían demasiadas. Se ofrecieron tres personas. Poco después murió un familiar de forma inesperada, la cosa se fue al traste y nunca retomó el hilo. Cuando volvió a mirarlo, además de los números había varios issues abiertos. Uno de ellos: al unir una ruta a una URL con barra final, el código elimina todas las letras "a" de la ruta.

El origen está en un comentario que reza // Workaround for trailing slashes. El truco consistía en añadir una "a" al final de la ruta para tener siempre un último segmento que cortar, y luego cortarlo con un buscar-y-reemplazar. Si la ruta ya terminaba en barra, ese segmento era la "a" suelta y el reemplazo se llevaba por delante todas las demás. Pasó desapercibido durante años.

Por qué no lo cede

La decisión es retirarlo sin más. La librería URI de The PHP League es la respuesta de la comunidad desde hace tiempo, y PHP 8.5 ya incluye una API de URI conforme al estándar en el propio lenguaje. Las dos son mejores que un parche de 174 líneas. Mantenerlo solo retrasaría una migración que conviene hacer, y transferirlo añadiría un riesgo encima. Smith no duda de quienes se ofrecieron; de hecho, ozh mantiene un fork para YOURLS. Pero un paquete con tanta instalación y un maintainer nuevo que nadie aguas abajo ha auditado es justo lo que buscan los atacantes. Cita el vídeo de Veritasium sobre la puerta trasera de xz Utils como el mejor relato de cómo termina eso.

El paquete seguirá instalándose desde Packagist, pero no recibirá más arreglos, tampoco el de la letra "a". Con doce años sin cambios, hasta un parche de una línea podría romperle algo a alguien sin nadie al otro lado para responder. El README explica cómo cambiar a las alternativas. Queda un detalle: AOL nunca migró su CMS fuera del polyfill "temporal". Siguió ahí hasta que apagaron la plataforma, hacia 2020.