我在隔离环境中使用chrome来扫描恶意网站以分析其数据以创建黑名单。用户脚本和浏览器扩展程序完全自动完成此过程。
问题是某些网站能够在beforeunload
或unload
上显示退出对话框(我将其称为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);
答案 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(window, 'onunload', {
value: null,
configurable: false
});
window.onunload = 1;
window.onunload;
// null
configurable
设置为false,表示无法更改属性。