如何为Greasemonkey';提供有限的接口;s GM_xmlhttpRequest到我的页面';什么是Javascript?

如何为Greasemonkey';提供有限的接口;s GM_xmlhttpRequest到我的页面';什么是Javascript?,javascript,security,api,greasemonkey,Javascript,Security,Api,Greasemonkey,我有一个Greasemonkey用户脚本,它通过插入标记在非特权上下文中运行大部分代码,如下所示: function code { ... } var script = document.createElement("script"); script.type = "application/javascript"; script.innerHTML = "(" + code + ")();"; document.body.appendChild(script); 这避免了使用unsafe

我有一个Greasemonkey用户脚本,它通过插入
标记在非特权上下文中运行大部分代码,如下所示:

function code {
  ...
}

var script = document.createElement("script");
script.type = "application/javascript";
script.innerHTML = "(" + code + ")();";
document.body.appendChild(script);
这避免了使用
unsafeWindow
执行危险操作的需要

但是,我的代码需要从另一个不支持JSONP的域上的API获取信息
GM_xmlhttpRequest
可以访问其他域,但仅在特权Greasemonkey上下文中可用

我想编写一个函数,它提供一个有限的接口,并使用
GM_xmlhttpRequest
准确地调用我需要的API,然后将该函数(理论上是安全的)公开到正常的页面上下文中。我的第一次尝试是:

unsafeWindow.foo = function() {
  console.log("Foo!");
  console.log(GM_xmlhttpRequest.toString());
  GM_xmlhttpRequest({
    method: "GET",
    url: "http://www.example.net/",
    headers: {
      "User-Agent": navigator.userAgent,
      "Accept": "text/html"
    },
    onload: function(response) {
      console.log(response);
      unsafeWindow.console.log(response);
      alert(response);
      unsafeWindow.alert(response);
    }
  });
  console.log("Bar!");
};
有趣的是,当我从页面上下文调用
foo()
时,我在控制台日志中看到“foo!”、字符串化的
GM_xmlhttpRequest
和“Bar!”。但是,我从未在控制台或警报中得到响应。如果我在GM上下文中单独执行
GM\u xmlhttpRequest
,我会收到警报和日志消息


问题是:我想做的事情可能吗?还是有其他方法可以完成同样的事情?

啊哈!答案已发布到一个网站上

Greasemonkey非常有意地这样做,并在页面上提供了一个简单的解决方法:


行得通。

啊哈!答案已发布到一个网站上

Greasemonkey非常有意地这样做,并在页面上提供了一个简单的解决方法:


这是可行的。

为什么首先要在一个没有特权的上下文中运行代码?我需要与页面上现有的脚本交互,直接从Greasemonkey上下文执行这项操作是痛苦的(也是不安全的)。它涉及到很多不安全的窗口。为什么您首先要在一个不受保护的上下文中运行代码?我需要与页面上现有的脚本交互,直接从Greasemonkey上下文执行这项操作是痛苦的(也是不安全的)。这涉及到很多不安全的因素。
unsafeWindow.foo = function() {
  window.setTimeout(GM_xmlhttpRequest, 0, {
    // ...
  });
};