Contexte et diffusion
En 2014, l’auteur a publié un polyfill de 174 lignes nommé http_build_url() pour pallier la suppression de la version 1 de l’extension pecl_http dans le CMS d’AOL. Le paquet a été mis à disposition sur Packagist, profitant de l’essor de Composer. Depuis, il a été téléchargé près de 20 millions de fois et continue d’enregistrer plus de 400 000 installations mensuelles. Son adoption s’est étendue au-delà de Composer : le plugin WordPress WPML l’intègre directement, le module idna-convert le dépend, et il apparaît dans les distributions Debian/Ubuntu via le CMS français SPIP.
Mécanisme du shim et bug du slash final
Le code définit la fonction uniquement si http_build_url() n’existe pas déjà, ce qui garantit la compatibilité descendante. Pour gérer les URL se terminant par un slash, l’auteur a ajouté un contournement :
// Workaround for trailing slashes
$path .= "a"; // ajoute un segment fictif
$path = str_replace("a", "", $path); // supprime le segment ajoutéLorsque le chemin se termine réellement par un slash, le segment ajouté est simplement « a ». La fonction str_replace supprime alors **toutes** les occurrences de la lettre « a » dans le chemin, entraînant la perte de caractères légitimes (ex. /data/alpha/ devient /d/t/). Ce comportement a été signalé dans les tickets GitHub, mais est resté non corrigé pendant plusieurs années.
Implications de la dépréciation
Le mainteneur annonce la mise en retrait du paquet, invoquant deux raisons principales : l’apparition d’une API URI native dans PHP 8.5 et la disponibilité de la bibliothèque PHP‑League URI, toutes deux plus robustes et maintenues. Conserver le shim exposerait les sites à un risque : un package largement installé sans mainteneur constitue une cible privilégiée pour des attaques de type supply‑chain, comme le montre la vidéo de Veritasium sur le backdoor de xz Utils. De plus, toute correction future, même minime, risquerait d’introduire des régressions dans les millions d’installations qui n’ont plus de support actif.
Migration et alternatives
Le README du paquet indique clairement la procédure de migration : remplacer l’appel au polyfill par l’API native UriInterface ou par la classe League\Uri\Uri. Cette transition élimine le bug du slash et profite des garanties de conformité aux standards RFC 3986. Les projets qui utilisent encore le shim, notamment WPML et les paquets Debian, devront planifier une mise à jour avant la fin du support de PHP 7, afin d’éviter des incompatibilités futures.