为什么浏览器允许onmousedown JS改变href?

时间:2011-08-26 14:10:30

标签: javascript security href phishing

我注意到很长一段时间,当您尝试复制链接位置或在Facebook上打开链接时,它会修改链接并将其传递给l.php

例如,我可以被发送到

 http://www.facebook.com/l.php?u=http%3A%2F%2Fwww.google.com%2F&h=DKVUritNDJDJLDLVbldoDLFKBLOD5dlfDJY_-d3fgDUaA9b

即使我的浏览器将链接预览呈现为http://www.google.com/

今天,我使用Firebug进行了仔细研究,发现Facebook将onmousedown="UntrustedLink.bootstrap($(this)[...]放入<a>标记。第二个我右键单击了链接,我在Firebug中看到href属性更改。

这让我担心。

我们很多人给不太精通技术的人提供的建议(在点击之前检查链接带你到哪里,这样你就不会成为网络钓鱼的受害者)现在似乎变得毫无用处。这不是安全隐患吗?网络钓鱼网站不能滥用这个吗?

为什么浏览器不会通过禁止onmousedown更改href或在阅读href属性之前运行javascript来阻止此行为,以便我被发送到该位置我以为我会去,而不是在我点击它时的一个变化?

编辑:我想简单地强调,除了网络钓鱼的风险之外,困扰我的是用户被误导,我觉得这可能会发生错误,无论是否受信任来源或不。

3 个答案:

答案 0 :(得分:5)

我同意此处存在网络钓鱼的可能性。很久以前这被报道为bug in FireFox,但问题是:

<body onmousedown="document.getElementById('changeMe').href='www.somewhereelse.com'">
    <a id="changeMe" href="www.google.com">google</a>
</body>

事件冒泡到其父级,您需要检测onmousedown事件是否会更改子元素的href。听起来合理吗?好的,这个怎么样:

<script>
    function switcher() {
       window.location = "www.somewhereelse.com";
       return false;
    }
</script>
<body onmousedown="switcher()">
    <a href="www.google.com">google</a>
</body>

因此我们需要在onmousedown事件触发的函数中查找window.location。还是合理吗?如果我有onmousedown事件完全删除链接,用一个新元素替换它然后触发点击该怎么样。我可以继续提出例子。

关键是,Javascript可以用来误导使用状态栏的人 - 你不应该信任它,你只能信任URL。

要更改此浏览器,需要在点击主持时对链接上的设置href值超过可能发生的任何其他事件,基本上禁用锚标记上的鼠标事件。我冒昧地猜测他们可能不会这样做,它会破坏已经存在的太多应用程序。

编辑或者,我看到人们提出了检测和警告用户可能的链接劫持的不同方法,但我还没有看到任何实现。

答案 1 :(得分:3)

  

我们很多人给不太精通技术的人提供的建议(在点击之前检查链接带你到哪里,这样你就不会成为网络钓鱼的受害者)现在似乎变得毫无用处。

如果通过“检查”表示链接“预览”浏览器显示在底部状态栏,那么您是正确的。这还不足以检查一个链接是否确实在它声称要去的地方。例如,在页面上运行下面的jquery脚本将导致所有链接转到google.com,无论链接的实际href目标是什么:

$('a').click(function(evt){evt.preventDefault();window.location.href="http://google.com"})

答案 2 :(得分:2)

  

网络钓鱼网站不能滥用这个吗?

不是真的,因为facebook是必须从中调用所述javascript的地方。用户必须首先使用不受信任的来源,将javascript嵌入到标记中。