mozIJSSubScriptLoader::loadSubScript:如何在不施加安全约束的情况下防止符号泄漏

mozIJSSubScriptLoader::loadSubScript: How to prevent leaking of symbols without imposing security constraints?

本文关键字:情况下 符号 泄漏 约束 施加 loadSubScript mozIJSSubScriptLoader 安全      更新时间:2023-09-26

在Mozilla的JavaScript环境中,可以使用mozIJSSubScriptLoader接口的loadSubScript()方法从URL加载其他脚本。

可以指定一个对象作为正在执行的脚本的作用域对象。然而,正如在Stackoverflow回答中解释的那样,"未声明的变量仍然会在外部作用域中创建,并且外部作用域中将搜索无法在下标作用域中解析的变量。"

这个答案建议使用Components.utils.Sandbox作为替代。

然而,这种机制显然支持安全限制。对于Mozilla错误876089,我尝试简单地用沙盒替换常规JS对象。加载的脚本就不能再使用组件了。

EXCEPTION: Permission denied for call method UnnamedClass.import

现在的问题是:在Mozilla环境中,我如何才能最好地加载脚本,以防止通过调用者的全局对象泄漏符号,但仍然允许它使用范围对象中显式放置的所有符号,而不施加任何安全限制?

确实,使用沙盒是正确的方法。安全设置可以通过使用一个特殊的主体作为作用域对象来管理,而不是一个普通的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");