javascript - 为什么用户脚本管理器仍然支持使用 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
. 另外作为旁注,unsafeWindow
Greasemonkey 和 Tampermonkey 的运行方式有什么不同吗?谢谢。
外部资源:
解决方案
让我们调用创建<script>
标签并将其插入到页面脚本注入中。
脚本注入有一些缺点。引用布洛克亚当斯的话:
- 脚本,至少注入的部分,不能使用函数提供的增强权限(尤其是跨域)
GM_
——尤其是GM_xmlhttpRequest()
.
- 可能会导致副作用或与页面的 JS 冲突。
- 使用外部库会引入更多的冲突和时间问题。它远没有那么容易
@require
。
@require
,还从本地副本运行外部 JS —— 加快执行速度,几乎消除了对外部服务器的依赖。
- 该页面可以查看、使用、更改或阻止脚本。
- 需要启用 JS。特别是 Firefox Greasemonkey 可以在 JS 被阻止的页面上运行。这可能是对臃肿、蹩脚和/或侵入性页面的天赐之物。
所以,一些开发者可能更喜欢使用unsafeWindow
而不是使用脚本注入。删除unsafeWindow
会使他们的事情变得更加困难。
unsafeWindow
通常只是工作,它可以比创建和注入脚本标签更简单。
另一个问题是,在网络上,向后兼容性通常是最重要的因素之一,即使有,也很少放弃。如果某些东西在 2015 版本中有效,一般的理念是它也应该在 2020 版本中有效,而不需要在 2015 版本上工作的人回来修复它(因为他们可能不再这样做了) . 相关讨论在这里。虽然用户脚本管理器不必像网络上的其他东西那样关心向后兼容性,但同样的推理也适用 - 避免破坏当前正在工作的东西,除非你有一个非常好的理由。
推荐阅读
- excel - 基于父子层次结构的分组项目分类
- linux - 为什么当我在 Ubuntu 中使用 wget 脚本下载 corix 数据时,ket 太小了
- html - 在更新 ts 文件中的变量时,如何知道在选择标记中单击了哪个选项?
- memory - 将 BooleanTensor 打包到 ByteTensor 会影响 LSTM(或其他 ML 模型)的训练吗?
- html - justify-content: left 和 justify-content: start 有什么区别?
- java - 如何从 Firebase Firestore 访问数组数据?
- r - 是否有用于计算具有阈值(maxDist)的快速 Levenshtein 距离的 R 函数
- c# - 如何从 C# 和 XAML 控制情节提要动画
- javascript - 如何在自动完成中设置默认选定项目
- flutter - 如何检查用户是否在 Flutter 中启用了漫游