Frontender Magazine

Взлом тега <a> в 100 символов

Совсем недавно я обнаружил, что JavaScript позволяет изменять атрибут href тега <a> после того, как вы по нему кликнете. Это, на первый взгляд, может показаться мелочью, но можете быть уверены, это позволит мошенникам обмануть пользователей и получить их личные данные.

Давайте я покажу вам пример. Эта ссылка должна привести вас на PayPal.

Кликните по ней и увидите, что ссылка не ведет на PayPal (кроме Opera, где это, похоже, исправлено). Это происходит потому, что когда вы кликнули по ссылке, я запустил код, который изменил атрибут href, и браузер неожиданно повёл вас по новой ссылке. Такого быть не должно. Посетители сайта (возможно, весьма технически грамотные люди) могут и будут считать, что попали на тот сайт, где оказались, благодаря обычному редиректу, в данном случае, с сайта PayPal. В прошлом году PayPal на протяжении нескольких месяцев перенаправлял пользователей с главной страницы их британского сайта на paypal-business.co.uk. Думаю, посетители сайтов привыкли к редиректам, и если использовать такое поведение браузеров, оно может представлять собой реальную угрозу Фишинга 2.0, как я его назвал.

Давайте взглянем на JavaScript:

// Код без сжатия
var links = document.links;
for(i in links) {
  links[i].onclick = function(){ this.href = 'demo.html'; };
}

// Сжатый код (было 100 символов; сейчас осталось 67, не считая ссылки)
// Спасибо sgoel из HN
o=document.links;for(i in o){o[i].onclick=function(){this.href='demo.html'}}

Этот приём сложно отследить. Практически все, кто используют JavaScript/jQuery, могут повесить обработчик на тег <a>, а это уже не исправить простым удалением атрибута onclick. А еще можно обернуть код в setTimeout и обойти любое решение этой проблемы. Любой более-менее приличный хакер может создать вирус или встраиваемый JavaScript, который сможет внедрить вышеуказанный код на сайт. Поскольку обновлять JavaScript (особенно встраиваемый) невероятно просто, думаю, что такие инструменты, как McAfeeSecure и PhishTank не продержатся против волны фишинга и секунды.

Поскольку возможность обновлять ссылку после клика по ней не приносит реальной пользы, я прошу консорциум W3C и вендоров лидирующих браузеров отключить возможность изменения атрибута href после срабатывания события onclick. Это простая ошибка интерпретатора, и, несмотря на то, что такое поведение кажется кому-то нормальным, его можно использовать в дурных целях. Я осознаю, что Google и ему подобные используют эту особенность поведения браузеров, но если мы стремимся сделать cеть безопаснее, то не можем позволить подобным ошибкам существовать. Есть альтернативные решения (например, использование подлинных ссылок, без маскировки), и возможности заменять после клика быть не должно. Она не стоит того, чтобы пользователи становились жертвами мошенничества и воровства.

Обновление (от 19.03.2013) — моя новая просьба состоит в предупреждении пользователей о том, что адрес ссылки изменяется на другой домен после клика (+1 abididea). Такие сайты как Google и Facebook могут продолжать нормально работать в рамках одного и того же домена, Интернет в безопасности, а возможность фишинга устранена. Все остаются в выигрыше (кроме фишеров, конечно!). Мне нужна ваша помощь, чтобы убедить вендоров основных браузеров как можно скорее исправить ситуацию. Давайте лишим мошенников ещё одного способа обманывать пользователей.

Обновление (от 19.03.2013) — Я предложил патч для Firefox, жду ответа.

Обновление (от 20.03.2013) — Ходят слухи, что в Google Chrome дыру закроют, но я еще не получил подтверждения.

Если вы заметили ошибку, вы всегда можете отредактировать статью, создать issue или просто написать об этом Антону Немцеву в skype ravencry.

Bilawal Hameed
Автор:
Bilawal Hameed
Сaйт:
http://bilaw.al/
Twitter:
@bilawalhameed
GitHub:
bih
Email:
bilawal@games.com
Игорь Дерябин
Переводчик:
Игорь Дерябин
Сaйт:
http://rodweb.ru/
Twitter:
@ru_rodweb

Комментарии (6 комментариев, если быть точным)

Автар пользователя
davidmz

link.onclick = function(e) { e.preventDefault(); window.open("http://evil.com/"); }

С этим как бороться будем?

ИМХО, статья глупая и паникёрская. Подобные методы дано используются (в мирных целях) во всевозможных сервисах аналитики и трекинга ссылок. Ничего страшного в этом нет, для защиты от фишинга надо смотреть на адрес сайта после перехода, а не до.

19-летнему автору статьи простительно этого не знать, но зачем её тиражируют по всему интернету?

Автар пользователя
SilentImp

davidmz это не статья «мы все умрем», это статья «а вы знали, что так можно?». По крайней мере я именно так ее рассматриваю. И да, название «желтенькое». Но это перевод и мы не могли его изменить. А вот вы знали, что так можно сделать? Только честно.

Автар пользователя
davidmz

Я у себя на сайте такое использую для трекинга внешних ссылок. Ну и всё-таки посыл у автора статьи именно «мы все умрём»:) Иначе бы он не побежал требовать от всех браузеров блокировки этого функционала.

Автар пользователя
SilentImp

К своему стыду должен признать, что я не знал о такой возможности и мне это кажется интересным. Про посыл автора спорить не буду, вы правы :) Но, вне зависимости от посыла, мне было интересно ее читать.

Автар пользователя
seleckis

Тоже не понимаю, чем в результате отличается от ...onclick... window.location...

Автар пользователя
LakeVostok

Уже давно привык открывать ссылки в новом окне, вообщем paypal у меня открылся