HN 日本語サマリー

← 一覧へ戻る
プログラミング

2014年のPHP一時修正が2000万回近くインストールされ、本日廃止します

My temporary PHP fix from 2014 has nearly 20M installs. Today I'm deprecating it (jakeasmith.com)

92 pointsby jakeasmith11 コメント

要約

著者は2014年、AOLのCMS移行のために一時的なPHP関数を作成しました。この関数は1〜2年で使われなくなるはずでしたが、Packagist経由で2000万回近くインストールされ、現在も多くのプロジェクトで使用されています。著者は数年後にこのパッケージを再発見し、バグの存在や、より優れた代替手段(PHP LeagueのURIライブラリやPHP 8.5の標準API)の登場を踏まえ、この一時的な修正を廃止することを決定しました。

全文翻訳

12年前、私はAOLのコンテンツ管理システム(CMS)のつなぎとして、174行のPHPコードを書きました。他の誰かが同じパッチを必要とするかもしれないと思いPackagistに公開したところ、以来、なんと2000万回近くインストールされています。そして本日、私はそれを廃止しました。 一時的なしのぎ 2014年、私たちはAOLのCMSをPHP 5.2から5.3へアップグレード中でした。そのアップグレードの一環として、pecl_http拡張機能のバージョン1を廃止することになり、それにはhttp_build_url()という関数が含まれていました。CMSは多くのURLを扱っており、私たちのシステムでは数十カ所でその関数が呼び出されていました。私はそれらのコードを変更するつもりはありませんでした。その関数は再現するのが十分簡単に見えたので、実際の関数がまだ存在しない場合にのみ定義される、独自のhttp_build_url()を作成しました。古いコードは何も変更されていないかのように動作しました。当時Composerが普及し始めており、共有が容易になりました。私は、PHPコミュニティがもっと良いものを見つけるまでの1〜2年で十分だろうと考えていました。 多くのインストール数 しかし、それは一時的なものではありませんでした。Packagistから2000万回近くインストールされ、毎月40万回以上のインストールが続いています。そして、Composerだけがすべてではないことがわかりました。WordPressの多言語プラグインとして市場をリードするWPMLは、このポリフィル(polyfill)を直接コードベースにバンドルしており、WPMLはそれが150万以上のサイトにインストールされていると述べています。ドメイン名ライブラリのidna-convertもこれに依存しており、それがSPIP(フランスのコンテンツ管理システム)のソースコードに同梱され、DebianやUbuntuのパッケージにも含まれることになりました。これらすべてを合わせると、あなたが私のコードを実行しているウェブサイトを訪れた可能性はかなり高いでしょう。まさかここまで広がるとは想像もしていませんでした。 再び向き合う 数ヶ月前、何年もぶりにパッケージを確認するまで、それがどれほど広まっているのか把握していませんでした。ユーザーがいることは知っていました。2021年までに私はPHPから離れてしばらく経っており、ダウンロード数が驚くほど多かったため、新しいメンテナーを募集しました。3人が申し出てくれました。募集した直後、予期せず家族を亡くし、しばらく私たちの世界はひっくり返りました。私はフォローアップせず、それは私の責任です。状況が落ち着いた頃には、他の目標が優先され、何年もパッケージのことを忘れていました。 数字だけでなく、GitHubのイシューもいくつかありました。その中には、URLに末尾スラッシュが付いている場合にパスを結合すると、パスからすべての「a」の文字が削除されてしまうというものもありました。まっすぐなコードとは程遠いものでした。// 末尾スラッシュの回避策と書かれたコメントの下で、私のコードはパスの最後に「a」を追加し、常に最後のセグメントを切り取れるようにしてから、find-and-replaceで切り取ります。パスがスラッシュで終わる場合、その最後のセグメントは単なる「a」であり、find-and-replaceはパス内の他のすべての「a」も一緒に削除してしまいます。このバグがこれほど長く見過ごされていたとは信じられません。 そこで、私は決断を迫られました。ほぼ10年ぶりにPHPの世界に戻り、申し出てくれた人たちにパッケージを引き継ぐか、あるいはそのまま放置するか。どれも違う それは常に一時的なものであるはずだったので、私はそれを引退させます。PHP LeagueのURIライブラリは長年コミュニティの答えとなっており、PHP 8.5には(jawira氏が指摘してくれたおかげで)言語自体に標準に準拠したURI APIが搭載されています。どちらも2014年の174行のシム(shim)よりも優れています。パッケージを維持することは、誰もが行うべき移行を遅らせるだけであり、引き継ぎはそれにリスクを加えることになります。申し出てくれた人たちを疑っているわけではありませんし、ozh氏はYOURLSのためにフォークを維持しています。しかし、下流で誰も検証していない、広くインストールされているパッケージは、まさに攻撃者が探しているものです。Veritasiumのxz Utilsバックドアに関するビデオは、それがどのように展開されるかについての私の見た中で最高の解説です。パッケージはインストールされ続けますが、欠落している「a」のバグを含め、新しい修正は受けられなくなります。変更がないままこれほど時間が経った後では、たとえ1行の修正でも、サポートする人がいないために誰かに意図しない結果をもたらす可能性があります。 READMEには切り替え方法が示されています。私はこのコードを、私自身と、同じ移行を経験している他の誰かのために、苦痛な移行を緩和するために書きました。プルリクエストを送ってくれたり、引き継ぎを申し出てくれたり、私が読まなくなってからもイシューを報告し続けてくれた人たちに感謝します。一時的な修正としては、良い走りでした。 P.S. AOLのCMSをその「一時的な」ポリフィルから移行することはありませんでした。それは2020年頃にプラットフォーム全体がシャットダウンされるまで、そこで稼働し続けました。