
Тимчасове рішення для PHP з 2014 року має майже 20 млн встановлень — тепер застаріле
Джейк А. Сміт написав 174 рядки PHP у 2014 році як тимчасову латку для CMS AOL. Після майже 20 мільйонів встановлень із Packagist він позначив пакет застарілим і радить переходити на нативний URI API у PHP 8.5.
У 2014 році Джейк А. Сміт написав 174 рядки PHP як тимчасову латку для системи керування контентом AOL. Він опублікував код на Packagist — раптом комусь знадобиться той самий патч. Через дванадцять років код встановили майже 20 мільйонів разів, а 15 вересня автор позначив пакет застарілим.
Тимчасова латка
Йшлося про оновлення CMS AOL з PHP 5.2 до 5.3, і частиною цього переходу була відмова від першої версії розширення pecl_http, яке давало функцію http_build_url(). Система керування контентом має справу з безліччю URL-адрес, і в цій функцію викликали в десятках місць, які Сміт не хотів чіпати. Натомість він її відтворив: власна http_build_url() визначалася лише тоді, коли справжньої ще не було, тож старий код не помітив жодної зміни. Саме тоді набирав обертів Composer, що полегшило поширення патча, і автор очікував, що його вистачить на рік-два.
Це багато встановлень
Тимчасовим воно не виявилося. Статистика Packagist, додана до допису, показує 19 864 271 встановлення загалом і 401 308 за останні 30 днів, а щоденні показники зросли з майже нуля у 2014 році до приблизно 13 000 на день у 2026-му. Composer — лише частина картини: WPML, провідний багатомовний плагін для WordPress, включає цей код до власної кодової бази й встановлений на понад 1,5 мільйона сайтів, а бібліотека доменних імен idna-convert залежить від нього — так код потрапив у вихідні тексти французької CMS SPIP і зрештою був упакований у Debian та Ubuntu.
Повернувшись до пакета після років перерви, Сміт знайшов і помилку: приєднання шляху до URL-адреси з кінцевою косою рискою вирізає зі шляху кожну літеру a. Під коментарем про обхідний шлях для кінцевих косих рис код додає до шляху зайву літеру a, щоб останній сегмент завжди було що відрізати, а потім відрізає його пошуком із заміною. Коли шлях закінчується косою рискою, ця заміна знищує й усі інші літери a. У 2021 році автор попросив нового супровідника, троє людей відгукнулися, але сталася несподівана втрата в родині, він не повернувся до питання, і пакет роками залишався без нагляду.
Застаріти, а не передати
Сміт відмовився і від того, щоб самому оживити пакет, і від того, щоб передати його комусь. Бібліотека URI від PHP League вже роки є відповіддю спільноти, а PHP 8.5 тепер містить URI API, сумісний зі стандартами, просто в мові; обидва варіанти кращі за латку на 174 рядки з 2014 року, а підтримка пакета лише затримала б перехід. Передавання широко встановленого пакета супровіднику, код якого ніхто знизу не перевіряв, на його думку, є саме тим, що шукають зловмисники. Пакет і далі встановлюватиметься, але нових виправлень не отримає, зокрема й для помилки з літерою a, адже навіть зміна на один рядок може мати непередбачені наслідки, коли підтримувати її нікому; у README описано, як перейти. Післямова: AOL так і не перевела свою CMS із тимчасової латки — код працював там до закриття платформи близько 2020 року.
SiTech — веброзробка з підтримкою AI
Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.