只要 @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)中 unsafeWindow
是 window.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
我编写了一个小的 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)中 unsafeWindow
是 window.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