IEの落し方

id:starocker:20060901:p1で紹介されている”たった1行のJavaScriptコードでInternet Explorerをクラッシュさせる方法”で昔同じようにクラッシュしたがことがあったのでそのときのコードのいくつかのサンプル。

紹介されているコード

もっと短くなりますね。これ一瞬無限ループ(?-?)みたいに思えてこないでもないけど無限ループではないです。最近のブラウザは無限ループで落ちるようには設計されていないです。

for(w in document.write){ document.write(w); };

これもクラッシュします

for(i in document.write);
for(i in alert);
for(i in print);

検証その1

種あかしはあとでするとしてまず以下のコードを実行してみます。

alert(document.write); // function write(){ [native code] };
alert(alert); // function alert(){ [native code] };
alert(print); // function print(){ [native code] };

全て[native code]。でも、for(i in String);とやってもIEは落ちない。alert(String); function String(){ [native code] };です。[native code]ですよ?Stringとprintやdocument.writeの違い。加えてArrayも落ちない。

検証その2*1

alert(alert instanceof Function); // IE : false , Firefox : true, Opera : true
alert(document.write instanceof Function); // IE : false, Firefox : true, Opera : true
alert(typeof(alert)); // IE : object, FirefoxとOpera : function
alert(typeof(document.write)); // IE : object, FirefoxとOpera : function 

というわけで、alertやdocument.writeは、IEでは、型がfunctionじゃなくてobjectになる。instanceofがFunctionじゃないからそうなるのか?IEではこれら関数の実装が違うためでJavaScriptからfor(i in 〜)をすると困ったことになるからだろう。

まとめ

  • 以下の条件に該当するものはfor(i in 〜);でIEがクラッシュする。
  • IEにあらかじめ実装されている関数でinstanceof Functionで true にならないものがそれにあたる。
  • 今わかっていてクラッシュするのは次の3つ。alert, document.write, print。

早急な改善希望

おそらくこれを利用して勝手にファイルがダウンロードされるとかバッファーオーバーランで任意のコードが実行されるとかいう恐れはないと思うけど。人間心理を利用すればかなり悪いことできるのではないかと思います。

*1:通りすがりさんに教えていただいたので追記。ありがとうございますm(__)m