The Prototype 1.5.1 makes Safari crash.
最近リリースされた prototype.js のバージョン 1.5.1 は、うちの Safari ( Safari 1.3.2 )をクラッシュさせる。
困った。機能が使えないということはさておいて、 Prototype はとてもポピュラーなライブラリだから、あちこちのサイトで利用されているだろう。つまり、あちこちのサイトで、うちのブラウザがクラッシュしてしまうことに、なるだろうから。
それを発見したのは、 Prototype を拡張するほかのライブラリを試してみた時だった。とてもよいライブラリだったのでぜひ使いたかったのだけれども、どうしてもクラッシュする。がっかりした。
でもやっぱり使いたいほうが勝って、せめてどこが悪いのかその場所だけでも突きとめて、作者に「 Safari を見捨てないで」と言う願いをこめたレポートを送ってみようと、ソースの中に入って行ったのだった。
そしたら原因は Prototype のほうにあった。
たとえば、ある要素の中身を書き換える Element.update() というのがある。次のようなコードでは、 P タグの中身を、 'It does not crash.' という文字列に置き換える。
<html><head><title>Element.update()</title>
<script type="text/javascript" src="prototype.js">
</script>
<script type="text/javascript">
Event.observe(window,'load',function(){
$('container').update('It does not crash.');
});
</script>
</head><body>
<p id="container">
update() replaces here.
</p>
</body></html>
ここでロードしている SCRIPT タグの prototype.js に、バージョン 1.5.1 の prototype.js を指定すると、 Safari 1.3.2 は、クラッシュしてしまうのだった。
クラッシュに気がついたときは、そのメソッドが引き金になっていたので、そこに注目していたのだけれども、そこから突き詰めて行くと、どうも Prototype.ScriptFragment にセットされている、次の正規表現のパターンに問題があるのだった:
ScriptFragment: '<script[^>]*>([\u0001-\uFFFF]*?)</script>',
つまるところ、 Element.update() に限らず、ほかの場面でも、このパターンを使って正規表現のエンジン?が動き出せば、それだけでクラッシュしてしまうのだった。
ちなみに、バージョン 1.5.0 の prototype.js では、クラッシュしない。そのバージョンの ScriptFragment はこうなっていた:
ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
したがって、この問題を回避するには、バージョン 1.5.1 の API を使うまえにその Prototype.ScriptFragment を、たとえばバージョン 1.5.0 の中身ように上書きする、になるだろうか?
でも、 ScriptFragment にセットするパターンの変更によってほかの場面に影響がないかが判らないので、気軽に変えるのも躊躇われる。前のバージョンからコンマ 1 だけのアップデートなのに、ここのパターンがわざわざ変わった理由には、なにかしらの大事なものが、あるに違いないのだから。
尤も、それを探す根気もないし、仮にここをじぶんが直せたとしても、それはじぶんのところだけの問題がなくなるだけだ。
それよりもなによりも、冒頭に述べたように、クラッシュするコードが、世に広く使われてしまう、しまうだろうことが、とても困るのだ。── Web が地雷だらけに、なってしまったように、思えてならない。
これは由々しき事態と感じたので、つたない英文を(翻訳ツールで)こさえて、いちおうプロジェクトにはレポートを入れておいた。伝わってくれれば、いいのだけれども。
しかしもうリリースされてしまっているものは、どうしようもない。せめて、 Prototype 1.5.1 はどうか使わないようにと、各方面?に、お願いしたい。──悪いのは Safari なんだろうけども。
参考
Safari JavaScript 正規表現のマッチングにリモートからの DoS 脆弱性 (.Mac Tips)
http://homepage.mac.com/yuji_okamura/iblog/DotMac/Tips/C1181169702/E20061116203705/index.html
──この記事に書かれた内容と関係がありそうに思うけれども、どうだろう。