如何在不使用unsafeWindow的情况下访问网站的唯一JavaScript对象?

时间:2013-04-18 22:21:47

标签: javascript userscripts

我目前正在尝试编写一个脚本,我将尝试在Chrome的扩展程序中使用该脚本。我了解unsafeWindow在Chrome中不起作用,因此我找到了一种模仿对象功能的解决方法(via this person's github)。

以下是链接中的相关代码:

var unsafeWindow = (function() {
    var e1 = document.createElement('p')
    e1.setAttribute('onclick', 'return window;');
    return e1.onclick();
})();

然后,我可以使用此功能访问网站的自定义/唯一JavaScript对象及其原型/属性,如下所示:

var newVar = unsafeWindow.WEBSITE.uniqueObject.prototype.uniquePrototype ... etc.

有人告诉我,这种解决方法是不好的做法,只有在没有其他简单的方法来访问唯一对象时才会使用。

在不使用unsafeWindow之类的内容的情况下访问网站的独特对象及其原型/属性会有什么更好或更安全的方法?

2 个答案:

答案 0 :(得分:1)

我注意到你没有给出真正的示例,而我不会涵盖所有假设的可能性;各种各样的现实世界网站有各种各样的技术。

安全的跨浏览器几乎每次尝试都有效,方法是Script Injection

function GM_main () {
    var newVar = WEBSITE.uniqueObject.prototype.uniquePrototype;
    /* Or, explicitely...
    var newVar = window.WEBSITE.uniqueObject.prototype.uniquePrototype;
    */

    // DO WHATEVER WITH newVar HERE.
}

addJS_Node (null, null, GM_main);

//-- This is a standard-ish utility function
function addJS_Node (text, s_URL, funcToRun, runOnLoad) {
    var D                                   = document;
    var scriptNode                          = D.createElement ('script');
    if (runOnLoad) {
        scriptNode.addEventListener ("load", runOnLoad, false);
    }
    scriptNode.type                         = "text/javascript";
    if (text)       scriptNode.textContent  = text;
    if (s_URL)      scriptNode.src          = s_URL;
    if (funcToRun)  scriptNode.textContent  = '(' + funcToRun.toString() + ')()';

    var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
    targ.appendChild (scriptNode);
}

这两种变体也与your previous question有关。



然而,想要使用unsafeWindow的人最常见的情况似乎是打败广告显示计时器或触发通常由链接或按钮触发的javascript。

在常用按钮/链接方案中,请勿使用unsafeWindow拆分沙箱。只需programmatically click or mousedown the control

在欺骗网站计时器的情况下,因为它是一行(不计算黑客攻击),这是unsafeWindow可能适合的一种情况。 EG:

unsafeWindow.payTheBillsTimerCounter = 0;

请注意:

  1. 愤怒的网站管理员理论上可以利用unsafeWindow
  2. 请不要违反任何服务条款(TOS)。
  3. 请支持您使用资源的网站(很多)。
  4. 对于Chrome用户脚本和内容脚本,unsafeWindow黑客攻击可能会在Chrome版本28左右被阻止。要在Chrome上直接编写脚本,请切换到Tampermonkey。 Tampermonkey很可能会继续支持unsafeWindow,而不需要任何黑客攻击(在您方面) Tampermonkey还提供近乎完美的Greasemonkey兼容性以及Chrome用户脚本不具备的一系列功能。

答案 1 :(得分:0)

您可以使用Message Passing在浏览器页面和扩展程序之间发送信息,反之亦然。