2

ユーザーが生成したJavaScript関数がデータベースに保存され、代わりに他の多くのユーザーに提供されるアプリケーションを構築しています。スクリプトは、管理者権限を持つ人物によって検証される必要があります (信頼できる人物である必要がありますが、スクリプトはユーザー自身によって選択されるため、一種の検証が必要と思われます)。

実行される関数は、計算目的のためだけの主要なものです。DOM へのアクセスや (少なくとも現時点では) グローバル オブジェクトは必要ありません。

ユーザーが文字列の単語をカウントする関数を定義するとします (簡単な例として)。

現時点での私のアプローチは、関数をクロージャーでラップし、入力プロパティを持つオブジェクトを渡し、その中にローカル var ウィンドウを定義して、このグローバル オブジェクトにアクセスできないようにすることです (明らかに、これでは十分ではありません。ウィンドウのすべてのプロパティを反復処理します)。オブジェクトとそれらをローカルで定義することは可能かもしれませんが、その見返りにいくつかの重要な機能が壊れる可能性があり、十分ではありません)

次のアイデアは、関数をオンザフライで ADsave 呼び出しにラップして、有害な可能性がある機能 (およびグローバル スコープへのアクセス) を防ぐことでしたが、これには、JSLint / adsave オプションをオンザフライで使用してコードを検証する必要があります。 (そして、これを行う方法に関する資料が見つかりません... !)

次のアプローチは、Caja のようなものを使用することです (実際には、JavaScript コードを Caja バージョンのコードに「変換」する必要があるため、新しい関数を簡単に追加する可能性がなくなります (これは、私自身のアプリケーションでは実行できません)。 -はえ)。

関数がサーバーから返されるたびに (クライアントで作成されたときだけでなく) 関数を検証する必要があるため、これまでのところ ADsave が最適なソリューションのようです。

上記の問題に対する解決策 (またはおそらくより良い解決策 - サードパーティの jscript (一部の DB から提供される) を安全な方法で実行することは、今日では非常に一般的なタスクです) を持っている人はいますか?

4

2 に答える 2

1

次のアプローチは、Cajaのようなものを使用することです(これは、javascriptコードをCajaバージョンのコードに「変換」する必要があるため、実際には新しい関数を簡単に追加する可能性を排除します(これは、私自身のアプリケーションでは実行できません) -はえ)。

最新のブラウザー(ECMAScript 5標準の実装が十分に正しいブラウザー)では、Cajaはコンテンツの主要な変換を実行する必要がなく、のサポートを含め、完全にクライアント側で動作できますeval()

于 2013-02-14T17:45:18.347 に答える
1

これが回避しようとしているアプローチであるかどうかはわかりませんが、Javascript を .xml ファイルで実行するだけ<iframe>です。

必要な Javascript のみが添付されたページをロードする iframe を使用すると、すべてのサンドボックスが処理されます。

編集- この回答へのコメントで説明されているように、iframe 内のスクリプトが親ドキュメントにアクセスできないようにするために、サブドメインで iframe ページをホストできます。このように、ブラウザは個別の Cookie を使用し、window.parent オブジェクトへのアクセスを拒否します。

于 2012-02-01T09:26:14.917 に答える