我正在尝试设置一个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
变量时,尽管显示了警告,但它仍未定义。
如何确保内容脚本编写的值在页面上可用?
答案 0 :(得分:6)
内容脚本中的window
对象通常是XRayWrapper
,这意味着您将获得原始对象,而不是网站可能覆盖的任何内容。这反过来也意味着,网站不会看到您对window
对象所做的任何修改。
但是,unsafeWindow.isInstalled = ...
应该有效(尽管.isInstalled
非常通用,因此可能与网站已经使用的变量发生冲突)。
请参阅有关XRayWrapper
和unsafeWindow
的{{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