特定の刑務所オブジェクトのコンテキストで実行される任意の JavaScript コードをユーザーが入力して実行できる HTML+JS 環境を作成したいと考えています。私がこれまでに持っているものを説明するために遊び場を設定しました。
これはややまともな仕事をします:
- 基本的な評価作業:
- 入力:
2 + 2
- 出力:
4
- 入力:
this
刑務所オブジェクトを返します- 入力:
this
- 出力:
[object Object]
- 入力:
this.hello()
期待されるメソッドを実行します- 入力:
this.hello()
- 出力:
hello world!
- 入力:
- ユーザーは独自の関数を設定して、後で実行できます。
- 入力:
this.foo = function() { return 42; }
- 出力:
function () { return 42; }
- 入力:
this.foo()
- 出力:
42
- 入力:
- 刑務所のコンテキストから「非表示」にしたいオブジェクトにアクセスしようとすると失敗します:
- 入力:
hidden
- 出力:
ReferenceError: hidden is not defined
- 入力:
ただし、次のようなグローバルにアクセス可能なプロパティを非表示にすることは完全に失敗しwindow
ますdocument
。
- 入力:
window
- 現在の出力:
[object Window]
- 望ましい出力:
ReferenceError: window is not defined
私がこれまでに思いついた最善の解決策は、更新されたバージョンに示されているように、私が考えることができるすべてのグローバル変数をJail オブジェクト宣言で、undefined
またはその宣言で埋めることです。このようにして、それらは刑務所の範囲内で永遠に失われたように見え、ユーザーはそれらにアクセスできなくなります。私の質問:null
- 私は正しいですか?これで十分安全ですか?
- つまり、特定のスコープでグローバルなものをいくつかのプレースホルダー値で書き換えるのではなく、実際に未定義にする方法はありますか?