0

我试图操纵一个网站使用 Greasemonkey(安装版本 4.9)完成的 XMLHttpRequest。拦截应该很简单(如何从 Greasemonkey 脚本中拦截 XMLHttpRequests?)但对我不起作用。也许新版本的 Greasemonkey 改变了?

我显然尝试了链接问题中的示例,但它们没有任何效果 - 尽管我的console.log(...)自定义打开功能中有一个,但控制台中没有打印任何内容。

接下来,我unsafeWindow试了一下。它不应该是必需的。我的用户脚本运行@grant none和文档( 这里)说我的脚本应该在内容范围内运行。

有了unsafeWindow效果,但它完全破坏了 XMLHttpRequest

// ==UserScript==
// @name          Test
// @version       1
// @include       *
// @run-at        document-start
// @grant         none
// ==/UserScript==

"use strict";

let realOpen = unsafeWindow.XMLHttpRequest.prototype.open

console.log("Real: " + realOpen)

unsafeWindow.XMLHttpRequest.prototype.open = function() {
  console.log("Called for " + this + " with URL: " + arguments[0])

  //call original
  return realOpen.apply(this, arguments)
};

window.addEventListener ("load", function() {
  console.log ("Page loaded");
});

console.log("Unsafe: ", unsafeWindow.XMLHttpRequest.prototype.open.toString())
console.log("Normal: ", XMLHttpRequest.prototype.open.toString())

这在控制台中提供以下输出:

Real: function open() {
    [native code]
}

Unsafe:  function() {
    console.log("Called for " + this + " with URL: " + arguments[0])

    //call original
    return realOpen.apply(this, arguments)
  }

Normal:  function open(method, url) {
    // only include method and url parameters so the function length is set properly
    if (arguments.length >= 2) {
      let newUrl = new URL(arguments[1], document.location.href);
      arguments[1] = newUrl.toString();
    }
    return origOpen.apply(this, arguments);
  }

==> Page loaded

如前所述,XMLHttpRequest 的功能被破坏了。当我使用 Firefox 开发者控制台进一步查看时,我得到了这个

>> window.XMLHttpRequest.prototype.open
Restricted {  }

任何设置在window(like window.foobar = "foobar") 上的属性在控制台中都不存在,但那些设置在上面unsafeWindow。我认为这与 Greasemonkey 的沙盒有关。

为什么即使我使用 XMLHttpRequest 也有两个版本@grant none?为什么我的自定义功能受到限制?我可以避免吗?为什么我在窗口上安装事件侦听器时它可以正常工作?

4

1 回答 1

0

接下来,我尝试了 unsafeWindow。它不应该是必需的。我的用户脚本使用 @grant none 运行,并且文档(请参阅此处)说我的脚本应该在内容范围内运行。

正如其公告中所述,这对于 Greasemonkey 4 来说是错误的:

由于新的扩展系统赋予我们的能力更加有限,我们目前无法使 @grant none 脚本以相同的方式工作。最重要的是,它们与 unsafeWindow 有不同的连接。至少在短期内,采用cloneInto 和 exportFunction是个好主意。

另请参阅其他问题Firefox 不尊重 Greasemonkey 脚本中的 Object.defineProperty()?

此更改解释了观察结果,但不知道为什么将侦听器添加到窗口工作。

于 2019-10-16T23:16:11.000 回答