Don't use the Prototype 1.5.1 !!

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

──この記事に書かれた内容と関係がありそうに思うけれども、どうだろう。

トラックバック

このエントリーのトラックバックURL:
http://hwat.sakura.ne.jp/mt/ftb.cgi/542

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

広告

国道

hugin - Panorama Tools GUI