为什么用户脚本中的 window(和 unsafeWindow)与 <script> 标签中的不同?

IT技术 javascript greasemonkey scope userscripts
2021-02-10 02:21:44

我在开发这个小用户脚本时遇到了一个问题当我想XMLHttpRequest用我的脚本阻止正在运行的网站上的每一个时,什么都没有发生(至少在 Chrome 中):

function main() {
  // Override XHR.open with a custom function
  window.XMLHttpRequest.prototype.open = function() {
    // Nothing... so it's supposed to block every xhr.open() call
  }
}
main();

替换windowunsafeWindow.

然而,当我使用这个小技巧时,一切都像一个魅力:

// No more call to main(), and:
var script = document.createElement("script");
script.textContent = "(" + main.toString() + ")();";
document.body.appendChild(script);

每次调用xhr.open都被我的自定义函数取代,不再是 AJAX。

所以我猜从脚本内部调用window元素与main<script></script>容器调用元素不同有人可以解释我为什么吗?

1个回答

请参阅“Chrome 用户脚本是否像 Greasemonkey 脚本一样与全局命名空间分开?” . Chrome 用户脚本/内容脚本和 Greasemonkey 脚本都与页面的 javascript 隔离。这样做是为了帮助您避免被黑客入侵,但它也减少了冲突和意外的副作用。

但是,每个浏览器的方法都不同......

火狐:

  1. XPCNativeWrapper 沙箱中运行脚本,除非@grant none有效(从 GM 1.0 开始)。
  2. 默认情况下将脚本包装在匿名函数中。
  3. 提供unsafeWindow访问目标页面的javascript。但请注意,敌对的网站管理员可能会跟踪unsafeWindow使用情况回到脚本的上下文,从而获得提升的特权来与您合作。

铬合金:

  1. “孤立的世界”中运行脚本
  2. 将脚本包装在匿名函数中。
  3. 严格阻止脚本对页面 JS 的任何访问,反之亦然。
    最新版本的 Chrome 现在提供了一个名为 的对象,以unsafeWindow实现非常有限的兼容性,但该对象不提供对目标页面的 JS 的任何访问。它与window在脚本范围内(不在window页面范围内)相同。

也就是说,unsafeWindow如果正确实施,您使用的脚本版本应该在 Firefox 上/在 Firefox 中工作。可能在 Chrome 上使用Tampermonkey 扩展程序工作,但我现在不打算仔细检查。

当您执行该“技巧” ( var script = document.createElement("script"); ...) 时,您代码注入目标页面。这绕过了沙箱,并且是普通 Chrome 用户脚本上脚本与页面 JS 交互的唯一方式。

注塑优势:

  1. 非 Tampermonkey 用户脚本访问目标页面提供的对象或功能的唯一方法。
  2. 几乎总是在 Chrome、Firefox、Opera 等之间完全兼容(IE 一如既往地是别的东西。)
  3. 通常更容易调试整个脚本;开发人员工具正常工作。

注射缺点:

  1. 脚本,至少注入的部分,不能使用GM_函数提供的增强权限(尤其是跨域)——尤其是GM_xmlhttpRequest().
    请注意,目前Chrome 仅支持GM_addStyleGM_xmlhttpRequestGM_logGM_openInTab,完全本机。然而,
    TampermonkeyGM_几乎完全支持函数。

  2. 可能会导致副作用或与页面的 JS 发生冲突。

  3. 使用外部库会引入更多冲突和时序问题。它远没有那么容易@require
    @require,还从本地副本运行外部 JS - 加快执行速度,几乎消除对外部服务器的依赖。

  4. 该页面可以查看、使用、更改或阻止脚本。

  5. 需要启用 JS。尤其是 Firefox Greasemonkey,它可以在 JS 被阻止的页面上运行。这在臃肿、蹩脚和/或侵入性页面上可能是天赐之物。

unsafeWindow Chrome 现在支持
2021-03-29 02:21:44
您写道“敌对的网站管理员可能会跟踪 unsafeWindow 的使用回到脚本的上下文”。我不明白如果我的脚本没有安全漏洞怎么可能。
2021-04-01 02:21:44