Pull to refresh

Re: Примитивная защита от фишинга

Reading time 4 min
Views 552
Пару ночей назад, пытаясь одолеть упущенные 1000+ в Google Reader, я наткунлся на топик «Примитивная защита от фишинга» хабраюзера hooey. И вдохновился.

Захотелось реализовать идею в виде расширения для Firefox, что я и попытался сделать.

Предупрежаю, это моё первое расширение для Firefox, оно было написано за пару вечеров, и я совершенно не пытаюсь сразу выдать какой-либо конечный продукт, а лишь хочу показать некий прототип.

Идея


Итак, вкратце:
  1. ищем ссылки, текстом которых является URL;
  2. проверяем, является ли ссылкой значение href (может оказаться что там якорь);
  3. сравнимаем хосты в тексте и в href;
  4. если не совпало, громко кричим и не даём пользователю ходить «налево».

Код


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.


Картинка


Вот так (отвратительно) это, пока что, выглядит на деле:

FishURL

На изображении этого не видно, но при наведении курсора на «плохую» ссылку, он принимает вид перечёркнутого кружочка, намекая что жать сюда не стоит.

Так же, в href кладётся «#» (а начиная с версии svn11 вообще href убирается), дабы пользователь не перешёл по ссылке перетягивая её (с помощью какого-нибудь расширения вроде QuickDrag).

Как вариант, ещё можно у ссылки выводить какую-нибудь предупредительную иконку.

Что дальше?


Если кого-нибудь заинтересует, я продолжу этим заниматься. Напишите что хочется, что не нравится, и спросите, если что-то не ясно в коде или логике.

Естественно, есть проблема ложных срабатываний, к примеру, при том же скачивании с Народ.Диск.

Ложное срабатывание FishURL при скачивании с Народ.Диск

Поэтому, вероятно, надо будет организовать black- или white- списки.

Где взять?


Скачать можно тут: fishurl-svn12.xpi

Раздаю под лицензией BSD, поэтому, если интересно, открываем xpi-файл (это ZIP-архив) и делаем с этим что душе угодно.

Если автору идеи (hooey) это каким-либо образом не нравится, я конечно же прекращу это дело ;)

И большое-пребольшое ему спасибо, и за идею, и за то что разбудил во мне желание покодить, и даже за увлекательные часы чтения developer.mozilla.org!
Tags:
Hubs:
+6
Comments 27
Comments Comments 27

Articles