0

これは純粋なJavaScriptサンドボックスの可能な解決策ですか?私の意志は、DOM、window、thisなどへのアクセスを許可せずに、信頼できないコードの文字列を実行することですが、ユーザーはMath、JSON、およびその他の機能にアクセスできます。Chromeでテストしました。

更新:サーバーのユーザー定義コードを保存して、他のユーザーが利用できるようにする可能性を提供したいと思います。安全にするために、ドキュメントへのアクセスを拒否する方法を探しています。

function safe(code,args)
{
    if (!args)
        args=[];
    return (function(){
      for (i in window) 
        eval("var "+i+";");
      return function(){return eval(code);}.apply(0,args);
    })();
}



ff=function()
{
    return 3.14;
}

console.log(safe("this;"));//Number
console.log(safe("window;"));//undefined
console.log(safe("console;"));//undefined
console.log(safe("Math;"));//MathConstructor
console.log(safe("JSON;"));//JSON
console.log(safe("Element;"));//undefined
console.log(safe("document;"));//undefined
console.log(safe("Math.cos(arguments[0]);",[3.14]));//-0.9999987317275395
console.log(safe("arguments[0]();",[ff]));//3.14

私は古い投稿でそれを提案しました:https ://stackoverflow.com/a/11513690/76081

ありがとう!

4

1 に答える 1

2

安全ではありません。次の構造は、サンドボックス内からグローバルwindowオブジェクトを取得します。

(function(){return this;})()

その時点で、などのグッズを含め、必要なものを抽出できますdocument

このエクスプロイトについて説明したhttps://stackoverflow.com/a/2673780/149341での回答について、TJCrowderにヒントを提供します。

于 2012-07-16T23:21:19.673 に答える