Почему браузеры позволяют onmousedown JS изменять href? - PullRequest
21 голосов
/ 26 августа 2011

Я очень давно заметил, что когда вы пытаетесь скопировать ссылку или открыть ссылку в 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>. Как только я щелкнул правой кнопкой мыши по ссылке, я увидел изменение атрибута href в Firebug.

Это меня беспокоит.

Совет, который многие из нас давали менее технически подкованным людям (проверьте, куда ведет вас ссылка, прежде чем щелкнуть, чтобы не стать жертвой фишинга), теперь, похоже, стал бесполезным. Разве это не угроза безопасности? Разве фишинговые сайты не могут этим злоупотреблять?

Почему браузеры не предотвращают это поведение, не разрешив onmousedown изменить href или запустив javascript перед чтением атрибута href, чтобы я отправился в то место, где, как я думал, я собираюсь, не одно изменение, пока я нажимал на него?

Редактировать : Я хочу вкратце подчеркнуть, что меня беспокоит больше, чем риск фишинга, это то, что пользователей вводят в заблуждение, и мне просто кажется неправильным, что это может произойти, будь то из доверенных источников или нет.

Ответы [ 3 ]

5 голосов
/ 26 августа 2011

Я согласен, что здесь есть потенциал для фишинга. Об этом сообщалось как ошибка в 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>

Таким образом, нам нужно обратить внимание на window.location в функциях, запускаемых также событиями onmousedown. Все еще звучит разумно? Как насчет того, если у меня в событии onmousedown вообще удалить ссылку, заменить ее новым элементом, а затем вызвать щелчок по нему. Я могу продолжать придумывать примеры.

Суть в том, что Javascript можно использовать для перенаправления людей с помощью строки состояния - вам не следует доверять, вы можете доверять только URL-адресу.

Чтобы изменить этот браузер, необходимо указать значение href для ссылки во время президентства клика над любыми другими событиями, которые могут произойти, в основном отключите события мыши на тегах привязки. Я рискну предположить, что они, вероятно, не сделают этого, это сломает слишком много приложений, которые уже существуют.

Редактировать: В качестве альтернативы я видел, как люди предлагали разные способы обнаружения и предупреждения пользователя о возможном угоне ссылок, но я еще не видел ни одного реализованного.

3 голосов
/ 26 августа 2011

Совет, который многие из нас давали менее технически подкованным людям (проверьте, куда ведет ссылка, прежде чем щелкнуть, чтобы не стать жертвой фишинга), теперь кажется бесполезным.1002 *

Если под «галочкой» вы подразумеваете ссылку «Предварительный просмотр», которую браузеры показывают в нижней строке состояния, значит, вы правы.Этого недостаточно, чтобы проверить, действительно ли ссылка идет туда, куда она претендует.Например, выполнение нижеприведенного сценария jquery на странице приведет к тому, что все ссылки перейдут на google.com независимо от того, какова фактическая цель ссылки href:

$('a').click(function(evt){evt.preventDefault();window.location.href="http://google.com"})
2 голосов
/ 26 августа 2011

Разве фишинговые сайты не могут злоупотреблять этим?

Не совсем, потому что facebook - это то место, откуда должен был быть вызван указанный javascript. Пользователь должен в первую очередь обратиться к ненадежному источнику, который вставит JavaScript в тег.

...