JSFiddleやjsdo.itのようにユーザに自由にJavaScriptを入力してもらって遊んでもらいたいと思っても、セキュリティを考えると二の足を踏んでしまいがちです。 そこで使ってみたいのがchainchomp.jsになります。JavaScriptをサンドボックス化して実行できるライブラリになります。 デモで実行ができます。ここに任意のJavaScriptを記述してその結果を確認できます。 例えばwindow.locationなどは実行できません。

console.log(chainchomp('return 1 + 2'));
// prints "3"

こんな感じの普通のコードは実行できます。

chainchomp('window.location = "http://example.com/"');    
// causes TypeError

しかしdocumentやwindowを扱うことはできません。

var scope = { puts: function(s){ console.log(s); } };
chainchomp('puts("Hello, World!");', scope);
// prints "Hello, World!"

scopeを使って別な関数を定義することもできます。

var scope = { puts: function(s){ console.log(s); } };
var f = chainchomp('return function(){ puts(new Date()); }', scope);
setInterval(function(){ chainchomp.callback(f); }, 1000);
// prints datetime every seconds

コールバックを使った実行もサポートされています。

var scope = { puts: function(s){ console.log(s); } };
var f = chainchomp('return function(){ window.location = "http://example.com/"; }', scope);
setInterval(function(){ chainchomp.callback(f); }, 1000);
// causes TypeError

しかしこんな感じでコールバックを使った危険なコードも実行はされません。 この手の技術は幾つか存在します。chainchomp.jsもまたそういった技術と同じレベルを目指しているようです。しかしアプローチ法は異なるようで、オーバーヘッドが極力小さくなるようにしているとされています。 確かにオーバーヘッドを考えないならばセキュアに使えるJavaScript実行エンジンをJavaScriptで作ってしまう方が良いかもしれません。しかし実行速度も考慮すると問題のあるコードをいかに判別して除外するか、そういった点に焦点がいくはずです。 JavaScriptのサンドボックス化ができれば、ユーザが自由にJavaScriptを使ったコンテンツサイトが作れるようになるでしょう。 chainchomp.jsはJavaScript製のソフトウェア(ソースコードは公開されていますがライセンスは明記されていません)です。 chainchomp.js Prison Break Game kontan/chainchomp.js