如何在Firefox Add On On中设置javascript变量使用Add On SDK创建?

时间:2013-11-14 18:01:32

标签: javascript firefox firefox-addon firefox-addon-sdk

我正在尝试设置一个javascript变量来识别安装了Firefox扩展程序。我们的想法是在页面上阅读这个变量。

在使用XUL附加组件(Set an object in a page's window object from a Firefox extension?)时无法使用复杂方法实现此功能,并在Firefox Add On SDK中找到适合该任务的contentScripts,我仍然无法访问javascript变量在页面上的contentScript中设置。

我的main.js中有以下内容(使用此处提供的示例https://addons.mozilla.org/en-US/developers/docs/sdk/latest/modules/sdk/page-mod.html):

var pageMod = require("sdk/page-mod");

pageMod.PageMod({
  include: "*",
  contentScript: 'window.isInstalled=true;window.alert("Page matches ruleset");',
  contentScriptWhen: "ready"
});

然而,当我尝试在页面上的javascript中获取window.isInstalled变量时,尽管显示了警告,但它仍未定义。

如何确保内容脚本编写的值在页面上可用?

1 个答案:

答案 0 :(得分:6)

内容脚本中的window对象通常是XRayWrapper,这意味着您将获得原始对象,而不是网站可能覆盖的任何内容。这反过来也意味着,网站不会看到您对window对象所做的任何修改。

但是,unsafeWindow.isInstalled = ...应该有效(尽管.isInstalled非常通用,因此可能与网站已经使用的变量发生冲突)。

请参阅有关XRayWrapperunsafeWindow的{​​{3}}。

解决@canuckistani提出的非常有效的问题:

unsafeWindow读取数据或执行其功能是安全的,因为它不能直接导致另一个(您的内容脚本)隔离区中的代码执行。 Spidermonkey的隔间将确保这一点。其他一切都是Spidermonkey或Gecko中的安全问题。 (请注意,这仅指Spidermonkey。IIRC它是唯一一个实现隔间或隔膜的引擎或任何您想要调用它的引擎。其他引擎可能具有其他安全属性。)

但是,您绝不能信任来自网站的数据。 unsafeWindow只是有更多方法可以帮助你。 总是除了抛出代码,拒绝为你提供意外的无限循环或类似的东西,永远不会明确或隐含地评估你的上下文中的代码。

E.g。这是一个安全漏洞,无论您使用window还是unsafeWindow:

for (var el of window.document.querySelectorAll("*[onclick]")) {
  el.addEventListener("click", el.getAttribute("onclick"));
  el.removeAttribute("onclick");
}

这将在您的脚本上下文中的网站控制字符串(.getAttribute)中创建匿名函数(事件侦听器),而不是网站的上下文。

这也是不安全的,但这次才使用unsafeWindow

for (var el of unsafeWindow.document.querySelectorAll("p")) {
  el.addEventListener("click", 'alert("I am ' + el.clientHeight + 'px tall");');
  el.removeAttribute("onclick");
}

使用XRayWrapper包裹window时,您可以确定document实际上是文档,document.querySelectorAll实际上是一个函数吐出一些元素而{{1}实际上是一个数值。

通过el.clientHeight所有这些假设可能都是错误的。该网站可能会做这样的事情:

unsafeWindow

虽然在权限升级意义上执行document.querySelectorAll = function() { return [{ clientHeight: 'a pwnd content script"); doSomethingEvil(); alert("Now I own you! And I am certainly not 0' }]; }; 仍然是安全的,因为被覆盖的函数仍将在网站的隔离区(安全上下文)中运行,但返回值根本不可信任。< / p>

或者脚本可能已经做了其他事情来破坏你的东西,不一定是恶意的。例如。你的离线拒绝服务。

unsafeWindow.document.querySelectorAll