greyemon键为一个简单的脚本抛出SecurityError



我是一个新手,正在尝试了解油彩键与嵌入式web控制台的区别。一个在网络控制台上完美工作的简单脚本在防油麦上不起作用,我不知道为什么。

环境

  • Arch Linux 上的Firefox 74.0

  • Greasemonkey 4.9

Web控制台

这是我使用的测试脚本:

(function() {
"use strict";
const w = window.open('https://www.google.com/', 'w');
console.log("Hello");
w.onload = () => {
console.log("World");
};
})();

当我访问https://www.google.com/webhp?gl=us&hl=en&gws_rd=cr&pws=0(谷歌美国首页(,将脚本复制并粘贴到web控制台中,然后执行它,

  1. 新窗口w加载https://www.google.com/已打开。

  2. 打印字符串Hello

  3. 打印字符串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");
};
})();

当我访问https://www.google.com/webhp?gl=us&hl=en&gws_rd=cr&pws=0(谷歌美国首页(,

  1. 新窗口w加载https://www.google.com/已打开。

  2. 打印字符串Hello

  3. 抛出SecurityError表示

    [Greasemonkey Script n/test]中的脚本错误:
    安全性错误:在跨源对象测试中访问属性"onload"的权限被拒绝:42:19
     nbsp 用户脚本:n/test:42

当我使用unsafeWindow而不是window时,

  1. 新窗口w加载https://www.google.com/已打开。

  2. 打印字符串Hello

  3. 其他事情都没有发生。(无错误,无World(

问题

我应该如何修改脚本,以便可以在防油精上执行?


更新

根据这条评论,该脚本在Chrome下的Tampermonkey或Violentmonkey上运行。

我还没有确认这一点,但已经确认该脚本可以在Firefox下的Tampermonkey 4.10.6105Violentmonkey 2.12.7上运行。

Web控制台是浏览器范围的一部分,而GreaseMonkey脚本被注入到页面内容中,其范围仅限于该页面。

您可以使用GM从页面内容中打开一个新的选项卡/窗口,但该窗口/选项卡将有自己的页面内容范围,该范围与第一个范围不同。因此,您不能从不同选项卡的页面内容访问属于另一个选项卡/窗口的属性。

这种分离适用于所有内容脚本,而不仅仅适用于GM。否则,如果一个选项卡/页面中的JS可以访问其他选项卡上的数据,就会产生巨大的安全风险。

更新:

正如wOxxOm所指出的,CSP和跨来源策略阻止了跨来源资源共享(CORS(。

在您的例子中,在Firefox中,第一个问题是Firefox将从内容脚本中"阻止弹出窗口"。

在FireMonkey上测试Firefox专用用户脚本API,在允许弹出后,仍然会导致错误:

SecurityError:访问上的属性"onload"的权限被拒绝跨原点对象

在这种情况下,我认为这是由于userScripts的沙盒安全性。

GM/TM/VM不使用userScripts API,而是使用其他方式注入userSripts,这会导致不同的结果。

最新更新