mozIJSSubScriptLoader::loadSubScript:如何在不施加安全约束的情况下防止符号泄漏
mozIJSSubScriptLoader::loadSubScript: How to prevent leaking of symbols without imposing security constraints?
在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");
相关文章:
- 如何在未直接触发的情况下停止事件
- 在不使用JQuery的情况下隐藏DOM中的选定元素
- 在不使用jquery的情况下查找页面中的所有锚点并附加函数
- 在不打开聊天屏幕的情况下制作Zopim-ding代理
- 在不阻止默认行为的情况下检测IE10中的缩放
- 如何在不传递此信息的情况下查找被调用的元素
- 如何在不刷新页面的情况下更新显示框
- 有没有一种方法可以在控制台关闭的情况下让console.log()在IE中记录消息
- JavaScript-在手机上不工作的情况下,在外部单击时隐藏元素
- 在我的情况下,如何进行http请求
- 在不知道深度或父属性的情况下从对象中删除属性
- 在不破坏未定义函数的情况下,对多个视图使用单个js文件
- ROR:如何在不重新加载浏览器的情况下从控制器获取参数
- 如何在不影响其他元素的情况下扩展DIV
- 如何在内联依赖项并将图像转换为dataURI的情况下完全提取网页
- Rangy如何在没有符号的情况下展开
- 是否可以在不轮询的情况下观看文本区域中的插入符号位置
- 如何从字符串中剪切第三个符号,并在没有第三个字符的情况下提醒它
- 在IE中获得插入符号位置在一种情况下工作,在另一种情况下不工作
- mozIJSSubScriptLoader::loadSubScript:如何在不施加安全约束的情况下防止符号泄漏