gpt4 book ai didi

javascript - 为什么来自用户脚本的窗口(和 unsafeWindow)与来自 <script> 标签的窗口(和 unsafeWindow)不同?

转载 作者:可可西里 更新时间:2023-11-01 01:20:42 26 4
gpt4 key购买 nike

我在开发这个 small userscript 时遇到了问题.当我想阻止每个 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();

替换 window 时相同通过 unsafeWindow .

然而,当我使用这个小技巧时,一切都很顺利:

// 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> 调用容器。谁能解释一下为什么?

最佳答案

参见 "Are Chrome user-scripts separated from the global namespace like Greasemonkey scripts?" . Chrome 用户脚本/内容脚本和 Greasemonkey 脚本都与页面的 javascript 隔离。这样做是为了帮助您免遭黑客攻击,同时也减少了冲突和意外的副作用。

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

火狐:

  1. an XPCNativeWrapper sandbox 中运行脚本, 除非 @grant none生效(自 GM 1.0 起)。
  2. 默认将脚本包装在匿名函数中。
  3. 提供unsafeWindow 来访问目标页面的javascript。但请注意,恶意网站管理员可能跟踪 unsafeWindow 用法回到脚本的上下文,从而获得更高的权限来欺骗您。

Chrome:

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

就是说,如果实现正确,使用 unsafeWindow 的脚本版本应该可以在 Firefox 上/在 Firefox 中运行。它可能使用 the Tampermonkey extension 工作在 Chrome 上,但我现在不打算仔细检查。

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

注入(inject)优势:

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

注入(inject)缺点:

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

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

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

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

  5. 需要启用 JS。特别是 Firefox Greasemonkey 可以在 JS 被阻止的页面上运行。这对于臃肿、糟糕和/或侵入性的页面来说是天赐之物。

关于javascript - 为什么来自用户脚本的窗口(和 unsafeWindow)与来自 &lt;script&gt; 标签的窗口(和 unsafeWindow)不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10824697/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com