Javascript greasemonkey为简单脚本抛出SecurityError
我是greasemonkey的新手,我试图了解greasemonkey与嵌入式web控制台的不同之处。在web控制台上完美运行的简单脚本在greasemonkey上不起作用,我不知道为什么 环境Javascript greasemonkey为简单脚本抛出SecurityError,javascript,firefox,greasemonkey,Javascript,Firefox,Greasemonkey,我是greasemonkey的新手,我试图了解greasemonkey与嵌入式web控制台的不同之处。在web控制台上完美运行的简单脚本在greasemonkey上不起作用,我不知道为什么 环境 Arch Linux上的Firefox 74.0 Greasemonkey 4.9 网络控制台 以下是我使用的测试脚本: (function() { "use strict"; const w = window.open('https://www.google.com/', 'w'
- Arch Linux上的Firefox 74.0
- Greasemonkey 4.9
(function() {
"use strict";
const w = window.open('https://www.google.com/', 'w');
console.log("Hello");
w.onload = () => {
console.log("World");
};
})();
当我访问(谷歌美国首页)时,将脚本复制并粘贴到web控制台,然后执行它
w
加载Hello
World
// ==UserScript==
// @name test
// @namespace n
// @match https://www.google.com/webhp?gl=us&hl=en&gws_rd=cr&pws=0
// ==/UserScript==
(function() {
"use strict";
const w = window.open('https://www.google.com/', 'w');
console.log("Hello");
w.onload = () => {
console.log("World");
};
})();
当我访问(谷歌美国首页)时
w
加载Hello
SecurityError
被抛出
[Greasemonkey脚本n/test]中的脚本错误:SecurityError:访问跨源对象测试的属性“onload”的权限被拒绝:42:19
用户脚本:n/测试:42
unsafeWindow
而不是window
时
w
加载Hello
World
)更新 根据,该脚本在Chrome下的Tampermonkey或Violentmonkey上运行
我还没有确认这一点,但已经确认该脚本在
Tampermonkey 4.10.6105
或Violentmonkey 2.12.7
下的FirefoxWeb控制台是浏览器范围的一部分,而GreaseMonkey脚本被注入页面内容,其范围仅限于该页面
您可以使用GM从页面内容打开一个新的选项卡/窗口,但该窗口/选项卡将有其自己的页面内容范围,该范围与第一个窗口不同。因此,您无法从不同选项卡的页面内容访问属于其他选项卡/窗口的属性
这种分离适用于所有内容脚本,而不仅仅适用于GM。否则,如果一个选项卡/页面中的JS可以访问其他选项卡上的数据,就会产生巨大的安全风险
更新:
正如wOxxOm所指出的,CSP和跨原产地政策防止了这种情况
在您的示例中,在Firefox中,第一个问题是Firefox将从内容脚本中“阻止弹出窗口”
允许弹出后,在上测试Firefox专用API仍会导致错误:
SecurityError:访问上的属性“onload”的权限被拒绝
交叉原点对象
在这种情况下,我认为这是由于为了安全起见对用户脚本进行了沙箱处理
GM/TM/VM不使用userScripts API,而是使用其他方式注入用户脚本,这会导致不同的结果。此脚本在Chrome中使用Tampermonkey或Violentmonkey(页面和内容注入模式),尽管erosman声称,但没有任何东西会阻止它工作。web中的安全性基于同源原则,因此Greasemonkey或Firefox抛出错误的事实意味着这只是一个错误或userscript API实现的固有缺陷。@wOxxOm正如您所建议的,在Firefox上使用
Tampermonkey 4.10.6105
,问题已经完全解决。但Tampermonkey不是OSS…好吧,那就用Violentmonkey吧。@wOxxOm我不知道它们。谢谢你的建议。