Взлом тега <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 дыру закроют, но я еще не получил подтверждения.