ITエンジニア/デザイナ向けにオープンソースを毎日紹介

JSFiddleやjsdo.itのようにユーザに自由にJavaScriptを入力してもらって遊んでもらいたいと思っても、セキュリティを考えると二の足を踏んでしまいがちです。

そこで使ってみたいのがchainchomp.jsになります。JavaScriptをサンドボックス化して実行できるライブラリになります。

デモで実行ができます。ここに任意のJavaScriptを記述してその結果を確認できます。
デモで実行ができます。ここに任意のJavaScriptを記述してその結果を確認できます。

例えばwindow.locationなどは実行できません。
例えば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

 

MOONGIFTの関連記事

コメント

  • DevRel
  • Com2