如何为Greasemonkey';提供有限的接口;s GM_xmlhttpRequest到我的页面';什么是Javascript?
我有一个Greasemonkey用户脚本,它通过插入如何为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
标记在非特权上下文中运行大部分代码,如下所示:
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, {
// ...
});
};