Временная заплатка для PHP из 2014 года прожила 20 миллионов установок

· Программы
Разработчик Джейк Смит объявил устаревшим свой полифилл http_build_url — 174 строки кода, написанные как временное решение для CMS компании AOL и разошедшиеся по миллионам сайтов.

cover.svg

Джейк Смит рассказал историю пакета, который он сам называет «временной заплаткой», прожившей двенадцать лет. В 2014 году, во время перехода CMS компании AOL с PHP 5.2 на 5.3, из системы выпадала первая версия расширения pecl_http с функцией http_build_url(). Эта функция вызывалась в десятках мест, переписывать которые автор не хотел, поэтому он воспроизвёл её сам — в 174 строках — с условием, что она определяется только при отсутствии оригинала. Старый код ничего не заметил.

Полифилл выложили на Packagist на случай, если кому-то пригодится тот же патч. Автор рассчитывал, что решение прослужит год-два, пока сообщество не найдёт что-нибудь получше.

Масштаб, которого никто не ждал

Вместо этого пакет установили почти 20 миллионов раз, и он по-прежнему набирает свыше 400 тысяч установок в месяц. Но Composer — лишь часть картины. Плагин многоязычности WPML для WordPress встраивает полифилл прямо в свой код и заявляет об установке более чем на 1,5 миллиона сайтов. От пакета зависит библиотека idna-convert, через которую он попал во французскую CMS SPIP, а затем в репозитории Debian и Ubuntu. Шанс наткнуться на сайт, работающий на этом коде, вполне реален.

«Straightforward» оказался с сюрпризом

Вернувшись к проекту впервые за годы, автор обнаружил среди прочего показательный баг. При склейке пути с URL, оканчивающимся слешем, из пути пропадали все буквы «a». Причина — в его собственном обходном приёме: под комментарием «Workaround for trailing slashes» код дописывал в конец пути букву «a», чтобы гарантированно был последний сегмент для отсечения, а затем удалял этот сегмент через поиск и замену. Если путь заканчивался слешем, поиск заодно вычищал все остальные «a». Автор признаётся, что не понимает, как ошибка так долго оставалась незамеченной.

Почему не передача, а отставка

Вариантов было три: вернуться к PHP после почти десятилетнего перерыва, передать пакет одному из желающих или оставить всё как есть. Смит выбрал четвёртый — пометить проект устаревшим. Ответ сообщества давно есть: библиотека URI от PHP League, а PHP 8.5 теперь несёт стандартизированный URI API прямо в языке. Оба варианта лучше шима из 2014 года.

Передачу автор счёл рискованной отдельно: широко установленный пакет с новым, никем из потребителей не проверенным сопровождающим — именно то, что ищут злоумышленники. В качестве иллюстрации он ссылается на историю бэкдора в xz Utils. Пакет продолжит устанавливаться, но обновлений, включая исправление бага с исчезающей «a», больше не получит.

В постскриптуме — финальная ирония: CMS самой AOL так и не переехала с «временного» полифилла и работала на нём до закрытия платформы около 2020 года.


Источник: Lobsters

Комментарии

Войдите, чтобы комментировать.

  • Пока нет комментариев.