Mar*_*rek 4 javascript firefox firefox-addon firefox-addon-sdk
我正在尝试设置一个javascript变量来识别安装了Firefox扩展.想法是在页面上读取此变量.
在使用XUL附加组件(在Firefox扩展中设置页面窗口对象中的对象?)时使用复杂方法未能实现此功能,并在Firefox Add on SDK中找到适合该任务的contentScripts,我仍然在访问页面上的contentScript中设置的javascript变量时遇到问题.
我在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"
});
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试window.isInstalled
在页面上的javascript中获取变量时,尽管显示了警报,但它仍未定义.
如何确保内容脚本写入的值在页面上可用?
window
内容脚本中的对象通常是一个XRayWrapper
,这意味着您将获得原始对象而不是网站可能覆盖的任何内容.这反过来也意味着,网站不会看到您对该window
对象所做的任何修改.
但是,unsafeWindow.isInstalled = ...
应该工作(虽然.isInstalled
非常通用,因此可能与网站已经使用的变量发生冲突).
查看有关和的文档.XRayWrapper
unsafeWindow
解决@canuckistani提出的非常有效的问题:
从中读取数据或执行函数unsafeWindow
是安全的,因为它不能直接导致在另一个(您的内容脚本)隔间中执行代码.Spidermonkey的隔间将确保这一点.其他一切都是Spidermonkey或Gecko中的安全问题.(请注意,这仅指Spidermonkey .IIRC它是唯一一个实现隔间或隔膜或任何您想要调用它的引擎.其他引擎可能具有其他安全属性).
但是,您绝不能信任来自网站的数据.unsafeWindow
只是有更多方法可以让你知道.总是除了要抛出的代码,拒绝为您提供意外的无限循环或类似的东西,永远不会明确或隐式地评估您的上下文中的代码.
例如,这是一个安全漏洞,无论您使用window还是unsafeWindow:
for (var el of window.document.querySelectorAll("*[onclick]")) {
el.addEventListener("click", el.getAttribute("onclick"));
el.removeAttribute("onclick");
}
Run Code Online (Sandbox Code Playgroud)
这将创建网站控制串匿名函数(事件监听器)( .getAttribute
)内的脚本上下文,没有一个网站的内容.
这也是不安全的,但只有在使用unsafeWindow
这段时间时:
for (var el of unsafeWindow.document.querySelectorAll("p")) {
el.addEventListener("click", 'alert("I am ' + el.clientHeight + 'px tall");');
el.removeAttribute("onclick");
}
Run Code Online (Sandbox Code Playgroud)
当使用XRayWrapper
包装时window
,你可以确定它document
实际上是文档,document.querySelectorAll
实际上是一个吐出一些元素的函数,el.clientHeight
实际上是一个数值.
经历unsafeWindow
所有这些假设可能是不正确的.该网站可能做过这样的事情:
document.querySelectorAll = function() {
return [{
clientHeight: 'a pwnd content script"); doSomethingEvil(); alert("Now I own you! And I am certainly not 0'
}];
};
Run Code Online (Sandbox Code Playgroud)
虽然在执行权限升级意义上它仍然是安全的unsafeWindow.document.querySelectorAll
,因为被覆盖的函数仍将在网站的隔离区(安全上下文)内运行,但返回值根本不可信.
或者脚本可能已经做了其他事情来破坏你的东西,不一定是恶意的.例如你的off-the-shell拒绝服务.
Object.defineProperty(document, "title", {
get: function() { while(true); }
});
// or
Object.defineProperty(document, "title", {
get: function() { throw new Error("get off my lawn!"); }
});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
558 次 |
最近记录: |