恶意的“确认导航”对话框?

恶意的“确认导航”对话框?

有些网站(例如 StackExchange)会在您尝试在特定条件下离开时弹出“您确定要离开此页面吗?”对话框,例如如果您有帖子尚未编辑完。这很有用!

不幸的是,恶意或受感染的网站喜欢使用相同的功能来表示:“嘿!您还没有安装我们的恶意软件防病毒软件来处理我们绝对不会撒谎的在您的计算机上发现的 111 种病毒!”,并且“离开此页面”和“留在此页面”选项被替换为“注意安全。安装我们的产品”和“搬起石头砸自己的脚”。这毫无帮助!

JavaScript 可以做一些令人讨厌的事情。当我收到其中一个对话框试图阻止我离开明显恶意的网站时,我应该如何回应?单击“离开此页面”或他们用什么替换文本安全吗?网站是否可以更改按钮的行为,或者拦截我离开的尝试并绘制自己的虚假对话框,当我单击它时,它会执行攻击者想要的任何操作?

答案1

尽管有些对话是这么说的,但它们不能做任何恶意的事情。您可以随时点击好的或者离开页面关闭违规页面而不承担任何后果。

如果对话太长,按钮不在屏幕上, 你可以Enter确认关闭页面。

如果你没有键盘(触摸屏设备),请使用下面的书签或查看SimpleSimon 的回答(仅限 Chrome)。


现在,介绍一些细节。

在页面关闭时执行某些操作的方法只有一种:通过onbeforeunload事件。当然,这很容易被用来对付用户(例如,当他试图关闭一个页面时,它会在新窗口中打开其副本),所以它非常有限。

实际上,您唯一可以做的合理的事情是打开一个带有自定义文本和两个按钮的对话框,一个按钮用于离开页面,一个按钮用于停留。页面唯一可以用该对话框做的事情就是定义其文本。按钮和标题栏是不可变的。以下是 Firefox 3.6 的屏幕截图:(非常旧版本的 Firefox)

Firefox 3.6 的屏幕截图

当然,当你让人们显示弹出窗口时任何文字和只是确定/取消按钮,那么你可以肯定,迟早会有人利用它来对付你。

Firefox 3.6 恶意窗口的屏幕截图

在上面的截图中好的仅表示“离开此页面”,但自定义描述暗示了更多内容。因此,浏览器已经更改了对话框,因此更难让它们产生误导。例如,最新版本的 Firefox 似乎忽略了自定义文本:

Firefox 23 的屏幕截图

Chrome 显示自定义文本,但总是附加一个问题询问用户想要做什么,并且按钮明确说明他们的操作:(但它仍然容易出现“猫视频”消息!)

Chrome 29 的屏幕截图

下面是 Internet Explorer 10,同样容易出现“猫感染”的情况:

IE 10 的屏幕截图

Opera 12 会忽略该onbeforeunload事件,如果您尝试关闭这样的选项卡,它将像其他选项卡一样关闭。不过,我还没有测试过最新的 Opera。

因此,总结一下最重要的事情:

  • 页面无法显示带有任何文本的对话框。网站可以要求浏览器显示带有自定义文本的对话框,但浏览器可以完全忽略它(Opera)、使用通用文本(Firefox)或明确说明将发生什么(Chrome、IE)。
  • 对话框的细节取决于你使用的浏览器,但按钮始终是不可变的。如果他们没有明确说明哪个按钮做什么,那么好的表示“离开此页面*并且取消是“留在这里”。
  • 如果您决定离开网站,网站将无法执行任何恶意操作。您的文件不会被替换为猫视频,您不会被 135234 种病毒淹没,FBI 也不会被告知您的计算机上有非法软件。

onbeforeunload如果需要,您可以禁用事件,从而有效地阻止页面要求您离开或留下。这是一个跨浏览器的用户脚本. (如果链接失效请向下滚动)

如果你在某个网站上看到恶意弹出窗口,而你仍然不敢点击离开,您可以创建一个书签小程序来删除它。右键单击书签栏,选择新书签(或等效代码)并将其粘贴为 URL:(它只是来自上述链接的压缩代码)

javascript:var x=document.createElement('script');x.type='text/javascript';x.innerHTML='onbeforeunload=function(){};';document.body.appendChild(x);

然后只需单击该书签,弹出窗口就会暂时从活动页面中删除。

如果您想测试这些弹出窗口在您的浏览器中的外观或测试书签/用户脚本,请使用以下代码创建一个文本文件并将其保存为文件.html

<html><body onbeforeunload="return 'My custom text.'">_</body></html>

看来用户脚本链接现在已失效,因此这里是从archive.org 缓存. 所有荣誉均归于原剧本创作者。

// ==UserScript==
// @name           Disable - remove onbeforeunload
// @namespace      
// @description    Disable - remove the annoying onbeforeunload event
// @include        *
// @author         netvisiteurs.com
// ==/UserScript==

var x = document.createElement('script');
x.type = 'text/javascript';
x.innerHTML = 'onbeforeunload = function() {};';
document.body.appendChild(x);

答案2

实际上,FireFox 有一个相当巧妙(且简单)的解决方案。如果你输入

about:config

在地址栏中,然后向下滚动到

dom.disable_beforeunload

并将其值设置为 True,您将不再看到“离开页面”弹出窗口。在 FireFox 中。遗憾的是 Chrome 中没有类似的解决方法。

答案3

Chrome 中最简单的解决方案是使标签页崩溃。

类型chrome://崩溃在地址栏中保存为书签

下次您想离开此类页面时,只需单击书签,它就会立即关闭该选项卡,而不会影响其他选项卡。无需像其他人建议的那样关闭整个浏览器会话。

或者,您可以使用chrome://hang然后只需关闭选项卡即可,无需运行任何 JavaScript。

不确定在其他浏览器中是否可以实现这一点。

答案4

如果您不信任“弹出窗口”及其意图/操作,可以采用快速解决方法:

对于 Chrome:

  • 退出以删除弹出窗口

  • 右键单击页面

  • 选择检查

  • 滚动到顶部

  • 右键单击标签

  • 删除节点

  • 关闭标签

我确信其他浏览器也有类似的选项。

相关内容