从页面函数中提取值...¿没有unsafeWindow?

时间:2011-10-23 11:11:32

标签: javascript greasemonkey

我是Greasemonkey的新手。我正在尝试创建一个用户脚本,以改善我经常访问的网站的用户体验。

所以我想创建一个javascript函数f()。我的函数需要一个值,根据我的快速研究并尝试理解网站的结构,只存在于javascript函数g()中。

我不确定哪个文件在服务器上保留g(),但我知道的是,一旦页面下载完毕,就可以使用g()

我想从g()中提取字符串值而不执行它(使用g.toString())。

我的问题是:如何在不使用g()来破坏我的计算机的情况下访问unsafeWindow? (window.g在Greasemonkey脚本中返回null

1 个答案:

答案 0 :(得分:1)

您必须使用unsafeWindow。这真的不是那么邪恶。

var string = unsafeWindow.g.toString();

unsafeWindow相对安全。我之前发现了一种在GreaseMonkey中访问不受限制的window对象的方法。使用特定方法,可以通过受影响的页面读取Userscript的原始代码。但是不能使用特定的GreaseMonkey函数(GM_getValue,..): Advanced GreaseMonkey: Using constructors/methods/variables at a remote page

编辑,关于标题更改
如果您担心g不是函数,或者函数的toString方法被覆盖,请使用以下代码:

//Store unsafeWindow.g in a variable, to reduce the possibly defined 
// __defineGetter__ calls to a minimum.
var g_string = unsafeWindow.g;
if(typeof g_string == "function"){
    g_string = Function.prototype.toString.call(g_string);
}
else g_string = ""; //Reset

安全吗?

以前的代码是最安全的方法,因为没有调用g的方法。 GreaseMonkey包装器还可以防止受影响的页面读取脚本:

window.g = function(){}
window.__defineGetter__("g", function(){
    alert(arguments.callee.caller);
});

前面的代码不会显示真正的调用者,而是一个无用的包装函数:

function SJOWContentBoundary() {
    [native code]
}