12年前の「とりあえず」が、2000万回インストールされていた
2014年、AOLの記事管理システムの引っ越し用に174行だけ書かれたPHPの“つなぎ”が、そのまま2000万回近く配られ、いまも月40万回入り続けている。書いた本人が先日、これを非推奨にした。
ひかり:けさスマホで見たサイトのうち何個かは、わたしが名前も知らない人が12年前に書いた174行で動いてるかもしれない——んだってっ! 174行だよっ! ノート1ページぶんっ!
みずき:…174行。去年の部誌、それより長いの書かされた。
ことね:まあ落ち着いて。順番に整理しましょう。書いたのはジェイク・A・スミスさん。2014年、AOLの記事管理システムを新しいPHPに引っ越させている最中の話よ。それまで使っていた、URLを組み立てる部品——http_build_url() という関数ね——が、引っ越し先では使えなくなることになったの。記事管理システムはURLだらけだから、何十か所からその関数を呼んでいた。全部を書き直すのは大変。だからスミスさんは、同じ名前で同じ働きをする代役を174行で書いて、「本物が見つからないときだけ動く」ようにしたの。おかげで古いコードは、中身がすり替わったことに最後まで気づかないまま動き続けたわ。……こういう“無いものの代役”を、ポリフィルと言うの。それを、せっかくだからみんなが使える置き場にも出した。当時ちょうど、PHPの部品を配る仕組みが広まりはじめたところでね。本人は「1年か2年もすれば、もっといいものが出て役目は終わるだろう」くらいに思っていたそうよ。……結果が2000万回近く。いまも月に40万回以上、新しく入り続けているわ。
ひかり:2000万回っ!? ノート1ページが2000万回っ!? ……ことね先輩、そんなに使われてたら、もう人気者じゃんっ!
ことね:しかも、その置き場から数えた数は一部でしかないの。WordPressを多言語にする定番の道具が、この174行を丸ごと抱えこんだまま配られていて、その道具は150万サイト以上に入っているわ。ほかにも、日本語などのドメイン名を変換する部品がこれに頼っていて、そのつながりでフランス製の記事管理システムに入り、DebianやUbuntuにも同梱されたの。本人いわく「あなたが訪れたことのあるサイトのどれかで、いまも私のコードが動いている見込みはかなり高い」。
みずき:…で、その174行、いま誰が面倒みてるの。
ことね:そこが、この記事のいちばん人間くさいところね。2021年、ダウンロード数の多さに驚いた本人が「誰か引き継いでくれませんか」と声をかけて、3人が手を挙げたそうよ。……でも、その直後にご家族を突然亡くされて、しばらくそれどころではなくなった。返事をしないまま年月が過ぎて、落ち着いたころには、もうその部品のことが頭から抜けていた——と、本人が書いているわ。それで数か月前、何年ぶりかに様子を見にいったの。そうしたら、数字のほかに、報告されたままのバグが残っていたのよ。……これがなかなかすごくてね。末尾がスラッシュのURLに道筋をつなぐと、その道筋から「a」という文字が全部消えるの。仕組みも情けなくて、切り落とす用のダミーとして末尾に「a」を1文字足して、あとで「a」を探して消す、という書き方をしていたの。だから元の末尾がスラッシュだと、ダミー以外の「a」まで道連れになる。しかもその行の上には、本人の手で「末尾スラッシュ対策」ってコメントが残っているのよ。本人も「よくこんなに長いあいだ見つからずに済んだものだ」と書いているわ。
ひかり:えっ、じゃあ banana って書いたら bnn になっちゃうのっ!? こわっ! ……で、直したのっ?
ことね:直さないの。引き継ぎ手に渡すのでもなく、非推奨にする道を選んだわ。理由は2つ。ひとつは、もう本物の後継が揃っていること。PHPの有名なライブラリ群にURL専用の道具があるし、PHP 8.5には言語そのものに正式なURLの窓口が入ったの。いま渡して延命させても、みんなが乗り換えるのを遅らせるだけだ、と。もうひとつが、こちらのほうが重いわね。「あちこちに入っているのに、下流の誰も素性を確かめていない新しい管理者」——それは、攻撃する側がいちばん狙う形なの。本人も、おととし見つかったxz Utilsの裏口の件を引き合いに出しているわ。ちなみにその追伸がまた効くの。AOLの記事管理システムのほうは、結局その“とりあえず”から一度も乗り換えないまま、2020年ごろにまるごと終了しました、って。
みずき:…善意で手を挙げた3人が、そのまま危ない側に数えられる。……やさしくない世界。
まとめ:「とりあえず」で書いた174行は、書いた本人の記憶より長生きした。乗り換えるはずだった側のほうが、先に消えた。