只要 @grant 类型为 'none',使用 unsafeWindow 的 Greasemonkey 脚本是否安全?

Is a Greasemonkey script that uses unsafeWindow secure as long as the @grant type is 'none'?

我编写了一个小的 Greasemonkey 脚本来向 YouTube 添加几个热键,以便在视频不一定具有焦点时控制音量:

// ==UserScript==
// @name     Custom Youtube Hotkeys
// @version  1
// @include  https://www.youtube.com/watch*
// @grant    none
// ==/UserScript==

var customScript_Player = unsafeWindow.document.getElementById("movie_player");

window.onkeypress = function(event) {
  //ignore keypress if focused on search bar
  if (unsafeWindow.document.activeElement.tagName === "INPUT") { return; }
  try {
    if (event.keyCode == 120) {
      customScript_Player.setVolume(customScript_Player.getVolume() + 5);
    } else if (event.keyCode == 122) {
      customScript_Player.setVolume(customScript_Player.getVolume() - 5);
    }
  } catch(err) { console.log(err.message); }
};

但是,我担心使用 unsafeWindow 会引发安全问题。 据我所知,有必要在页面元素上执行 JavaScript,但我看到有关它带来的安全风险的相互矛盾的信息。

我看过几个讨论,其中声称使用它打开的唯一安全漏洞来自 APIs Greasemonkey 提供的,这些漏洞在脚本中使用@grant none 被阻止header,并且只要将授权设置为 none,页面就无法执行任何正常情况下无法执行的操作。

但是,wiki 本身就避免使用 unsafeWindow 发出了一些警告,并且似乎从来没有指出使用它自己的问题时唯一的问题 API。

上面的脚本安全吗?如果没有,有没有更安全的方式注入可以控制页面元素的javascript?

谢谢!

I'm concerned about the security concerns raised with the use of unsafeWindow.

在 GreaseMonkey 中,用户脚本 运行 在 content 脚本上下文中,而网页 JavaScript 运行s 在 page 上下文中。

Xray vision 分隔是专门为了防止页面 JavaScript 获得特权功能的访问权限。

unsafeWindow 在两个上下文之间创建了一个桥梁,如果不小心,可以将一些 content 上下文函数暴露给 page JavaScript.

注意: 在 GreaseMokey(和 FireMonkey)中 unsafeWindowwindow.wrappedJSObject 的别名。因此,使用两者之间没有区别。 unsafeWindow 的 TamperMonkey 和 ViolnetMonkey 实现不同。

在您的示例代码中,如果您不需要使用任何 GM 函数,则只需将整个代码注入 page 上下文即可,无需 unsafeWindow 例如

const script = document.createElement('script');
script.textContent = '...code....';
document.body.appendChild(script);
script.remove(); // if you want, makes no difference