0

Mozilla の JavaScript 環境では、 mozIJSSubScriptLoader インターフェイスの loadSubScript() メソッドを使用して、URL から他のスクリプトを読み込むことができます。

実行中のスクリプトのスコープ オブジェクトとして使用されるオブジェクトを指定することができます。ただし、この Stackoverflow answerで説明されているように、「宣言されていない変数は引き続き外側のスコープで作成され、添え字スコープで解決できない変数について外側のスコープが検索されます。」

この回答では、代わりにComponents.utils.Sandboxを使用することをお勧めします。

ただし、このメカニズムにより、セキュリティの制限が有効になっているようです。Mozilla バグ 876089については、単純に通常の JS オブジェクトをサンドボックスに置き換えてみました。読み込まれたスクリプトは Components.utils を使用できなくなり、"Cu" としてスコープ オブジェクトに配置されます。

例外: のメソッド NamenameClass.import を呼び出す権限が拒否されました

ここで問題: Mozilla 環境で、呼び出し元のグローバル オブジェクトを介したシンボルの漏洩を防ぐだけでなく、セキュリティ上の制限を課すことなくスコープ オブジェクトに明示的に配置されたすべてのシンボルを使用できるようにする方法で、スクリプトを最適にロードするにはどうすればよいでしょうか? ?

4

1 に答える 1

1

実際、サンドボックスを使用することは正しいアプローチです。セキュリティ設定は、プレーンな JavaScript オブジェクトの代わりに、スコープ オブジェクトとして特別なプリンシパルを使用して管理できます。

システム プリンシパルを使用すると、すべてのセキュリティ チェックが無効になります。

コードは次のようになります。

Components.utils.import("resource://gre/modules/Services.jsm");
var systemPrincipal = Services.scriptSecurityManager.getSystemPrincipal();
var scopeObject = new Components.utils.Sandbox(systemPrincipal); 
// set properties of the scope object like this:
// scopeObject.someProperty = someValue;
var loader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
  .getService(Components.interfaces.mozIJSSubScriptLoader);
// Set uri to the uri of the script to load
loader.loadSubScript(uri, module, "UTF-8");
于 2013-05-26T10:23:50.643 に答える