如何使用usercript完全禁用所有退出警告/确认消息?

时间:2015-10-05 21:59:20

标签: javascript jquery google-chrome userscripts tampermonkey

我在隔离环境中使用chrome来扫描恶意网站以分析其数据以创建黑名单。用户脚本和浏览器扩展程序完全自动完成此过程。

问题是某些网站能够在beforeunloadunload上显示退出对话框(我将其称为events)。

我已经覆盖了这些events,但当网站再次覆盖我的覆盖时,整个过程就会停止。我的意思是他们可以使用AJAX调用,混淆脚本,evals等来重新定义events

有没有办法摆脱这些消息,或保护我的覆盖? 也许unsafeWindow会处理这个,但我会避免在这个讨厌的环境中使用它。

编辑 - 目前我在我的用户名中使用此代码:

location.href = "javascript:(" + function() {
    window.onbeforeunload = null;
    window.onunload = null;
} + ")()";

setInterval(function(){
    location.href = "javascript:(" + function() {
        window.onbeforeunload = null;
        window.onunload = null;
    } + ")()";
}, 3000);

2 个答案:

答案 0 :(得分:1)

我认为您使用的是旧版Chrome,因为自Chrome 51 [Custom messages in onbeforeunload dialogs (removed)]以来已删除此行为。

问题依赖于onBeforeUnload事件。浏览器( Chrome和Firefox至少)已禁用onUnload事件内的消息。您尝试连接计时器并更改window.onbeforeunload = null的页面可能还使用计时器以非常小的间隔值(甚至1毫秒)设置相同的事件,因此覆盖该事件将非常困难当有另一个具有较小间隔的计时器时,一次又一次地设置它。我的方法是杀死脚本中的所有计时器,它对我使用的是我在旧VM中的Chrome 49。

// ==/UserScript==

(function() {
    'use strict';

    var killId = setTimeout(function() {
        for(var i = killId; i > 0; i--) clearInterval(i);
        window.onbeforeunload = null;
        // If you don't use interval timers then disable setInterval function
        // else you can store the function to a variable before
        // you set it to an empty function;
        // Same goes for setTimeout
        setInterval = function() {};
    }, 10);

})();

对于参考测试页面,我使用这个运行间隔计时器的简单javascript来设置每毫秒window.onbeforeunload

function goodbye(e) {
    var msg = 'You sure you want to leave?';
    if(!e) e = window.event;
    if(e) {
        //e.cancelBubble is supported by IE - this will kill the bubbling process.
        e.cancelBubble = true;
        e.returnValue = msg; //This is displayed on the dialog

        //e.stopPropagation works in Firefox.
        if (e.stopPropagation) {
            e.stopPropagation();
            e.preventDefault();
        }
    } else
        return msg;
}

// Set a timer to hook `onBeforeUnload` event every millisecond
setInterval(function() { window.onbeforeunload = goodbye; }, 1);

有些网页可能会使用setTimeout()代替setInterval(),因此您可能还需要停用setTimeout = function() {}功能。

答案 1 :(得分:0)

尝试Object.defineProperty

Object.defineProperty(window, 'onunload', { 
    value: null,
    configurable: false
});

window.onunload = 1;

window.onunload;
// null

configurable设置为false,表示无法更改属性。