evalな脱線

先日、yamagata氏にevalをいじめられたので。ちょっと考えてみました。
任意の文字列を生成できたとしても、ソレが、任意のスクリプトを実行できること、とは雲泥の差なのでありまして、この意味で、eval()は必須と思っておりましたので、yamagata氏による防衛はカンペキコちゃんと思ったのでありました。
そこで!なにげに調べてみたらFunction コンストラクタは文字列から関数を生成できるのです。これだ!


eval('alert(99)')


(eval)('alert(99)')


(new Function("xxx","return eval(xxx)"))('alert(99)')


(new Function("xxx","return ev" + "al(xxx)"))('alert(99)')


(new Function("xxx","return ev" + "al(\'alert(99)\')"))()


(new Function("xxx","return ev" + "al(\'al" + "ert(99)\')"))()


for(dummy in {dummy:0}){
(new Function(dummy,"return ev" + "al(\'al" + "ert(99)\')"))()
}

…あとは、文字列をstringなオブジェクトに置換して、「+」をコンカチすればいいのかぁ・・・あう?使えないはずの「,」どうする?めんどくさいので放置。というか挫折? アイデア募集中。