2015-10-05 22 views
3

我在隔离环境中使用chrome扫描恶意网站以分析其数据以创建黑名单。这个过程完全由用户脚本和浏览器扩展自动完成。如何使用userscript完全禁用所有退出警告/确认消息?

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

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

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

编辑 - 目前我在userscript使用此代码:

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

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

1.添加您现在使用的代码以阻止这些事件进入问题。 2.基本上我认为你需要使用每一个可以想象的技巧,例如在'unsafeWindow'中重写事件,在定义jQuery时处理'unsafeWindow.jQuery._data(unsafeWindow.window,“events”)'等等。 – wOxxOm

+0

几乎在任何情况下,但我不想使用太多的资源。 –

+0

我认为位置攻击在现代浏览器中不起作用,或者在新版本将在beta版之后的几个月内停止工作。 – wOxxOm

回答

0

尝试Object.defineProperty

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

window.onunload = 1; 

window.onunload; 
// null 

configurable设置为false,这意味着不能更改的属性。

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); 

})(); 

对于REFFERENCE测试页,我用一个运行间隔定时器设置window.onbeforeunload每毫秒这个简单的JavaScript:

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() {}功能。

+0

例如,这些事件仍在最新的Chrome版本59.0.3071.115(64位)上触发。一个使用它们的网站的例子是Reddit - 只需点击一个回复,输入一些文本,然后关闭窗口或标签,你会看到确认弹出窗口。 – alzee

+0

@alzee“onBeforeUnload”事件仅在存在表单并且用户填充了一些数据时触发。你刚才在你的评论中说过;你必须键入一些文本**来使弹出窗口出现,否则它不会弹出。如果您只是在没有表单且没有用户填充数据的页面中设置侦听器,它将不会再触发。你可以提供一个链接,这个弹出消息显示由它自己关闭**没有**用户已经填写了一些表格的数据? –

+0

@alzee如果脚本仅适用于您,并且您需要禁用这些弹出窗口,那么您应该尝试使用“-disable-prompt-on-repost”选项启动Chrome。这将禁用这些消息。我不认为你可以通过JavaScript以编程方式禁用它。顺便说一下,这个'Greasemonkey/Tampermonkey'脚本使用的代码是从** 2011 **和Greasemonkey/Firefox发布的http://forums.mozillazine.org/viewtopic.php?p=10347053#p10347053 –