1

公式の例では、 をラップするだけのcaja.jsファイルを使用iframeして、caja コンパイル サービスをホストしているサーバーから URL をロードし、そのサーバーが何らかの URL から入力を取得しているようです。それに関連する API は、こちらから入手できます。

ただし、私が本当に望んでいるのは、次のように、ユーザーが提供する Javascript を安全に (そして繰り返し) 実行することです。

for (var i = 0; i < N; ++i) {
    var x = getUserResult(currentState);
    updateState(currentState, x);
}

これを直接行う方法はありますか?ここのコードにはコンパイラがあります。それを使用してコードをコンパイルし、エミュレートされたコンテキスト内で実行できないのはなぜですか? ブラウザで安全なコンテキストを取得する唯一の方法はiframe? もしそうなら、 を使用しiframeて、外部 URL から取得することなく、特定のソース コードを直接実行する方法はありますか?

4

1 に答える 1

2

Cajaにはどうしても必要iframeです。どちらの実行モードでも、安全な実行を可能にするために根本的に変更できる一連の JavaScript グローバル (フレームを作成することによって取得) が必要です。

最新の Caja (ES5 モード) では、サーバー側のコンパイル手順は必要ありません。ブラウザに互換性があれば、標準的な方法で Caja を使用でき、サーバーに接続することはありません。これを強制するes5Mode: trueには、オプションで を指定しますcaja.initialize

一度ゲスト コードを読み込んで、繰り返し実行することができます。apiロード時にゲストが関数を渡すことができる を提供するだけで、いつでも関数を呼び出すことができます。


あなたのユースケースでは、Caja自体をまったく使用せずに、Cajaの最新の安全な評価サブシステムであるSESを使用することもできます。これにより、iframe をスキップできますが、SES 互換の方法でコードを記述する必要があります。あれは、

  • Object.prototype、およびなどのグローバル オブジェクトの変更を控える
  • を使用して、ユーザー提供のコードに直接的または間接的に公開されているすべてのオブジェクトを保護しますObject.freeze()。)

やる気がある場合は、SES を直接使用することをお勧めします。SES を使用すると、多くの間接的な問題と全体的な複雑さが取り除かれますが、安全に成功するには概念を理解する必要があります。

于 2014-03-21T16:43:53.037 に答える