32

私のサイトでユーザーが送信したスクリプトを提供する必要があります(jsfiddleのようなものです)。スクリプトは、提供されているページから分離して、訪問者のブラウザーで安全に実行する必要があります。コードはユーザーによって送信されるため、信頼できるという保証はありません。

今、私は3つのオプションを考えることができます:

  • ユーザーが送信したコンテンツを別のドメインのiframeで提供し、同一生成元ポリシーに依存します。これには、可能であれば避けたい追加のドメインを設定する必要があります。これがjsfiddleのやり方だと思います。スクリプトはtop.location.href、たとえば変更するなど、まだある程度のダメージを与える可能性がありますが、これは理想的とは言えません。http://jsfiddle.net/PzkUw/
  • サンドボックス属性を使用します。これはブラウザ間で十分にサポートされていないようです。
  • スクリプトを提供する前に、スクリプトをサニタイズします。行きたくない。

他の解決策、または上記に関する推奨事項はありますか?

アップデート

私が思うに、最初のオプションが最善の解決策である場合、トップウィンドウの場所を変更する以外に悪意のあるスクリプトで何ができるでしょうか。また、これを防ぐにはどうすればよいですか。静的コード分析に基づいて特定のスクリプトを操作または拒否できますが、オブジェクトにアクセスできる方法の数と、一般にJavaScriptを静的に分析することの難しさを考えると、これは困難です。少なくとも、本格的なパーサーといくつかの複雑なルールが必要になります(JSLintに存在するものもありますが、すべてではないと思います)。

4

4 に答える 4

26

明確に定義されたメッセージ インターフェイスを作成し、サンドボックス化するコードに JavaScript Web Worker を使用します。HTML5 Web ワーカー

Web ワーカーは、次の DOM オブジェクトにアクセスできません。

  • ウィンドウ オブジェクト

  • ドキュメント オブジェクト

  • 親オブジェクト

そのため、ページをリダイレクトしたり、ページ上のデータを変更したりすることはできません。

テンプレートと適切に定義されたメッセージング インターフェイスを作成して、ユーザーが Web ワーカー スクリプトを作成できるようにすることはできますが、スクリプトは何を操作するかについて最終的な決定権を持ちます。

Jordan Gray によるEDITコメントは、私が上で説明したことを行うように見える JavaScript ライブラリをプラグインします。https://github.com/eligrey/jsandbox

于 2012-09-25T14:49:28.127 に答える
5

アプリケーションで役立つツールのいくつかのアイデア - それらは 2 つの異なる方向から問題を攻撃します: Caja は信頼できない JavaScript コードを安全なものにコンパイルし、AdSafe は安全に使用できる JavaScript のサブセットを定義します。

カハ

カハ

Caja Compiler は、サードパーティの HTML、CSS、および JavaScript を安全に Web サイトに埋め込むためのツールです。これにより、埋め込みページと埋め込みアプリケーションの間の豊富な対話が可能になります。Caja は、オブジェクト機能のセキュリティ モデルを使用して、幅広い柔軟なセキュリティ ポリシーを可能にします。これにより、Web サイトは、埋め込まれたサード パーティ コードがユーザー データに対して実行できることを効果的に制御できます。

AdSafe

AdSafe

ADsafe は、ゲスト コード (サード パーティのスクリプト化された広告やウィジェットなど) を Web ページに安全に配置できるようにします。ADsafe は、悪意のあるまたは偶発的な損傷や侵入を防止しながら、ゲスト コードが貴重な対話を実行できるようにするのに十分強力な JavaScript のサブセットを定義します。ADsafe サブセットは JSLint などのツールによって機械的に検証できるため、ゲスト コードの安全性を確認するために人による検査は必要ありません。ADsafe サブセットは、適切なコーディング プラクティスも実施し、ゲスト コードが正しく実行される可能性を高めます。

于 2012-09-23T02:31:17.520 に答える
-4

windowdocument、および要素へのアクセスを削除してコードの一部をサンドボックス化したい場合は、これらがローカルの空の変数であるクロージャーでラップすることで実現できます。

(function(window, document, parent /* Whatever you want to remove */){
  console.log(this);      // Empty object
  console.log(window);    // undefined
  console.log(document);  // undefined
  console.log(parent);    // undefined
}).call({});

空のオブジェクトで呼び出すことが重要です。そうしないと、これはwindowオブジェクトを指します

于 2012-09-27T21:35:02.803 に答える