Пару ночей назад, пытаясь одолеть упущенные 1000+ в Google Reader, я наткунлся на топик «Примитивная защита от фишинга» хабраюзера hooey. И вдохновился.
Захотелось реализовать идею в виде расширения для Firefox, что я и попытался сделать.
Предупрежаю, это моё первое расширение для Firefox, оно было написано за пару вечеров, и я совершенно не пытаюсь сразу выдать какой-либо конечный продукт, а лишь хочу показать некий прототип.
Итак, вкратце:
Вот так (отвратительно) это, пока что, выглядит на деле:
На изображении этого не видно, но при наведении курсора на «плохую» ссылку, он принимает вид перечёркнутого кружочка, намекая что жать сюда не стоит.
Так же, в href кладётся «#» (а начиная с версии svn11 вообще href убирается), дабы пользователь не перешёл по ссылке перетягивая её (с помощью какого-нибудь расширения вроде QuickDrag).
Как вариант, ещё можно у ссылки выводить какую-нибудь предупредительную иконку.
Если кого-нибудь заинтересует, я продолжу этим заниматься. Напишите что хочется, что не нравится, и спросите, если что-то не ясно в коде или логике.
Естественно, есть проблема ложных срабатываний, к примеру, при том же скачивании с Народ.Диск.
Поэтому, вероятно, надо будет организовать black- или white- списки.
Скачать можно тут: fishurl-svn12.xpi
Раздаю под лицензией BSD, поэтому, если интересно, открываем xpi-файл (это ZIP-архив) и делаем с этим что душе угодно.
Если автору идеи (hooey) это каким-либо образом не нравится, я конечно же прекращу это дело ;)
И большое-пребольшое ему спасибо, и за идею, и за то что разбудил во мне желание покодить, и даже за увлекательные часы чтения developer.mozilla.org!
Захотелось реализовать идею в виде расширения для Firefox, что я и попытался сделать.
Предупрежаю, это моё первое расширение для Firefox, оно было написано за пару вечеров, и я совершенно не пытаюсь сразу выдать какой-либо конечный продукт, а лишь хочу показать некий прототип.
Идея
Итак, вкратце:
- ищем ссылки, текстом которых является URL;
- проверяем, является ли ссылкой значение href (может оказаться что там якорь);
- сравнимаем хосты в тексте и в href;
- если не совпало, громко кричим и не даём пользователю ходить «налево».
Код
var fishurl = {
onLoad: function() {
var appcontent = document.getElementById("appcontent");
if (appcontent)
appcontent.addEventListener("DOMContentLoaded", this.onDOMLoad, true);
},
onDOMLoad: function(e) {
if (e.originalTarget instanceof HTMLDocument) {
fishurl._parseDocument(e.originalTarget);
}
},
_parseDocument : function(doc) {
// перебираем все ссылочке в документе
for (var i = 0, l = doc.links.length, item, textUrl, hrefUrl; i < l; i++)
{
item = doc.links[i];
textUrl = this._parseUrl(item.text);
// пропускаем, если текст ссылки не является URL
if (!textUrl)
continue;
hrefUrl = this._parseUrl(item.href);
// пропускаем, если href не является URL (он, к примеру, может быть якорем)
if (!hrefUrl)
continue;
// собственно, самая важная проверка
if (textUrl.host != hrefUrl.host)
{
// запоминаем куда ведёт подозрительная ссылка
var _href = item.href;
// и вешаемся на click по ней
item.addEventListener(
"click",
function() {
// если всё же пользователю хочется, открываем в новой вкладочке
if (confirm ("Хочешь попробовать фишинг на своей шкуре?\n[" + _href + "]"))
gBrowser.selectedTab = gBrowser.addTab(_href);
return false;
},
false);
// убираем оригинальный URL от греха подальше
item.removeAttribute("href");
item.setAttribute("rel", "nohref");
// курсор на ссылке «говорит» нельзя
item.style.cursor = "not-allowed";
// ну и вообще стоит эту гадость зачеркнуть
item.style.textDecoration = "line-through";
}
}
},
_parseUrl: function(data) {
// корявый regexp, я знаю!.. если URL «хороший», то вернётся объект, иначе — false
return data.match(/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?([\w.-]+)(:[0-9]+)?(\/([\w#!:.?+=&%@!\-\/])*)?/) ?
{ url: RegExp['$&'], schema: RegExp.$1, auth: RegExp.$2, host: RegExp.$3, port: RegExp.$4, path: RegExp.$5 } : false;
}
};
// вешаемся на событие load
window.addEventListener("load", function() { fishurl.onLoad(); }, false);
* This source code was highlighted with Source Code Highlighter.
Картинка
Вот так (отвратительно) это, пока что, выглядит на деле:
На изображении этого не видно, но при наведении курсора на «плохую» ссылку, он принимает вид перечёркнутого кружочка, намекая что жать сюда не стоит.
Так же, в href кладётся «#» (а начиная с версии svn11 вообще href убирается), дабы пользователь не перешёл по ссылке перетягивая её (с помощью какого-нибудь расширения вроде QuickDrag).
Как вариант, ещё можно у ссылки выводить какую-нибудь предупредительную иконку.
Что дальше?
Если кого-нибудь заинтересует, я продолжу этим заниматься. Напишите что хочется, что не нравится, и спросите, если что-то не ясно в коде или логике.
Естественно, есть проблема ложных срабатываний, к примеру, при том же скачивании с Народ.Диск.
Поэтому, вероятно, надо будет организовать black- или white- списки.
Где взять?
Скачать можно тут: fishurl-svn12.xpi
Раздаю под лицензией BSD, поэтому, если интересно, открываем xpi-файл (это ZIP-архив) и делаем с этим что душе угодно.
Если автору идеи (hooey) это каким-либо образом не нравится, я конечно же прекращу это дело ;)
И большое-пребольшое ему спасибо, и за идею, и за то что разбудил во мне желание покодить, и даже за увлекательные часы чтения developer.mozilla.org!