首页 > 解决方案 > 为什么用户脚本管理器仍然支持使用 unsafeWindow?

问题描述

unsafeWindow制作 API 以便用户脚本可以与脚本执行的页面的变量和函数进行交互。但是,强烈建议不要这样做,因为网站可能会劫持用户脚本unsafeWindow并使其执行恶意代码。然而,为什么它unsafeWindow甚至是必要的,为什么它仍然被使用?在 Firefox 39 之前,用户可以使用 location hack 作为unsafeWindow. 由于 Firefox 39 中的更新修复了这个问题,这个黑客最终停止了工作。尽管如此,用户仍然可以在隔离沙箱中使用 GM API,并通过如下脚本标签插入代码:

const fnToRunOnNativePage = () => {
  console.log('fnToRunOnNativePage');
};

const script = document.body.appendChild(document.createElement('script'));
script.textContent = '(' + fnToRunOnNativePage.toString() + ')();';
// to use information inside the function that was retrieved elsewhere in the script,
// pass arguments above
script.remove();

我从这个 stackoverflow 帖子中得到了这段代码: 如何让我的用户脚本在隔离沙箱和 unsafeWindow 中执行代码?

那为什么unsafeWindow还能用呢?上面的代码几乎是unsafeWindow. 另外作为旁注,unsafeWindowGreasemonkey 和 Tampermonkey 的运行方式有什么不同吗?谢谢。

外部资源:

标签: javascriptbrowsersandboxexecutionuserscripts

解决方案


让我们调用创建<script>标签并将其插入到页面脚本注入中。

脚本注入有一些缺点。引用布洛克亚当斯的话:

  1. 脚本,至少注入的部分,不能使用函数提供的增强权限(尤其是跨域)GM_——尤其是GM_xmlhttpRequest().
  1. 可能会导致副作用或与页面的 JS 冲突。
  1. 使用外部库会引入更多的冲突和时间问题。它远没有那么容易@require
    @require,还从本地副本运行外部 JS —— 加快执行速度,几乎消除了对外部服务器的依赖。
  1. 该页面可以查看、使用、更改或阻止脚本。
  1. 需要启用 JS。特别是 Firefox Greasemonkey 可以在 JS 被阻止的页面上运行。这可能是对臃肿、蹩脚和/或侵入性页面的天赐之物。

所以,一些开发者可能更喜欢使用unsafeWindow而不是使用脚本注入。删除unsafeWindow会使他们的事情变得更加困难。

unsafeWindow通常只是工作,它可以比创建和注入脚本标签更简单。

另一个问题是,在网络上,向后兼容性通常是最重要的因素之一,即使有,也很少放弃。如果某些东西在 2015 版本中有效,一般的理念是它也应该在 2020 版本中有效,而不需要在 2015 版本上工作的人回来修复它(因为他们可能不再这样做了) . 相关讨论在这里。虽然用户脚本管理器不必像网络上的其他东西那样关心向后兼容性,但同样的推理也适用 - 避免破坏当前正在工作的东西,除非你有一个非常好的理由


推荐阅读