Переходя по ссылкам, размещенным во Вконтакте, можно заметить, что как и в остальных социальных сетях, сначала происходит переход на «безопасную» ссылку, после чего социальная сеть решает: нужно ли пускать пользователя дальше или нет. Большинство внимательных людей замечали пол-секундное появление «vk.com/away.php» в адресной строке браузера, но, конечно, не придавали этому значения.



Предыстория


Однажды, некий программист, доделав очередной проект, осознал, что одержим желанием о нём всем рассказать. Проект размещался на сервере с уникальным IP, но без доменного имени. Поэтому на скорую руку был сделал красивый поддомен третьего уровня в домене .ddns.net, который в итоге использовался в качестве ссылки. 

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



Казалось бы, умные пользователи сами вправе решать, на какой сайт им переходить, а на какой нет, однако Вконтакте думает иначе и не предоставляет никакой возможности без костылей перейти по ссылке.

Что не так


У такой реализации есть несколько весомых недостатков:

  • Отсутствие возможности открыть подозрительный сайт. Как говорилось выше, у пользователя нет возможности преодолеть заглушку. Единственный способ открыть ссылку — скопировать ее и вставить в адресную строку.
  • Замедляет переход по ссылке. Скорость перенаправления зависит от пинга. Соответственно при большом пинге, могут пропасть драгоценные секунды жизни, что, как мы знаем, не допустимо.
  • Мониторинг переходов. Такой метод облегчает сбор информации о действиях пользователей, чем конечно же и пользуется Вк, добавляя к безопасной ссылке id поста с которого был сделан переход.

Освобождаем Джанго


Оптимальным решением всех выше перечисленных проблем может стать расширение для браузера. По очевидным причинам выбор падает на Chrome. На хабре есть отличная статья статья посвященная написанию расширений для Сhrome.

Для создания такого расширения нам понадобится создать в отдельной папке два файла: json-Manifest и JavaScript-файл для мониторинга текущего url адреса.

Создаем Manifest файл


Главное что нам нужно — дать расширению разрешение на работу с вкладками и назначить исполняемый скрипт:

{
  "manifest_version": 2,
  "name": "Run Away From vk.com/away",
  "version": "1.0",
  "background": {
    "scripts": ["background.js"]
  },
  "permissions": ["tabs"],
  "browser_action": {
    "default_title": "Run Away From vk.com/away"
  }
}

Создаем js файл


Здесь всё просто: в событие, вызываемое при создании новой вкладки, добавляем проверку на url адрес, если он начинается на «vk.com/away.php», то заменяем его на правильный, который находится в GET-запросе:

chrome.tabs.onCreated.addListener( function (tabId, changeInfo, tab) {
	chrome.tabs.query({'active': true, 'lastFocusedWindow': true}, function (tabs) {
		var url = tabs[0].url;
		if (url.substr(0,23) == "https://vk.com/away.php"){
			var last = url.indexOf("&", 0)
			if(last == -1)last = 1000;
			var url = decodeURIComponent(url.substr(27, last-27));
			chrome.tabs.update({url: url});
		}
	});
});

Собираем расширение


Убедившись что оба файла лежат в одной папке, открываем Chrome, выбираем вкладку расширения и нажимаем «Загрузить распакованное расширение». В открывшемся окне выбираем папку написанного расширенная и нажимаем собрать. Готово! Теперь все ссылки вида vk.com/away заменяются на исходные.

Вместо заключения


Конечно, такой тип заглушек спас много людей от миллионов мошеннических сайтов, однако, я считаю, что люди сами в праве решать, переходить им на небезопасную ссылку или нет.
Для удобства я разместил проект на github.

Комментарии (16)


  1. MonkAlex
    23.07.2019 12:26
    +2

    Для js-скриптов однострочников есть специальный аддон — www.tampermonkey.net

    Скрипт будет работать сразу во всех нужных браузерах, будет явно ограничен выполнением на vk.com и доверия у меня лично будет больше.

    ПС: единственное что, не уверен, доступно ли там будет апи необходимое. Правда, всегда можно подменять href =)


    1. dartraiden
      23.07.2019 17:47
      +1

      Кроме того, есть Redirector (Chrome / Firefox), поддерживающий регулярные выражения.


    1. mistergrim
      23.07.2019 18:48
      +1

      Собственно, скрипт, решающий данную проблему (и не только с ВК), давно есть.
      greasyfork.org/ru/scripts/22667-direct-links


      1. qw1
        23.07.2019 20:26

        Так себе решение, потому что скрипт вмешивается в код страницы и заменяет значения атрибутов href. Наверняка можно либо детектировать вмешательство, либо делать переход средствами js (onclick => location.href = ...)
        Лучше браузерное расширение, как упомянутый выше Redirector.


        1. mistergrim
          23.07.2019 20:32

          Может, и так себе, но оно существует, и работает.


        1. MonkAlex
          23.07.2019 21:43

          Таки как раз таки скрипт — прост и хорош (и работает, ха!).

          А вот дополнение — мутная тема.


  1. GennPen
    23.07.2019 12:31

    однако, я считаю, что люди сами в праве решать, переходить им на небезопасную ссылку или нет
    Мне кажется, тут еще с юридической стороны есть небольшой момент.
    Если нет заглушки с предупреждениями, то проходя по ссылке на подозрительный ресурс можно предъявить претензии на сайт с которого был сделан переход.
    А с заглушкой: «Мы вас предупреждали, вся ответственность на вас», особенно если человек сам вставляет ссылку в адресную строку.


    1. Gar02
      23.07.2019 13:35

      Правильно, зачем делать удобно?


      • Нагнись, бабка! Теперь болит?
      • Нет.
      • Вот так и ходи!
        С заглушкой согласен, но какого чёрта ещё и ссылку самому вставлять? Это уже перебор.


    1. Get-Web
      23.07.2019 18:00

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


  1. kvazimoda24
    23.07.2019 12:31
    +2

    "был сделал красивый поддомен второго уровня в домене .ddns.net"
    Домен третьего же уровня.


  1. 402d
    23.07.2019 12:53
    +3

    До идеального трояна в манифесте не хватает
    update_url: http //vasya.pupkin/crx

    Жду следующую версию для обхода предупреждений о переходе
    на домены из этого списка nslist.net/ns1.nwgsm.ru

    Сарказм. Не надо снижать безопасность. Купить домен и прикрутить Let's Encript проще чем уговаривать всех поставить вредное расширение в броузер.


    1. swelf
      23.07.2019 13:16
      +1

      Ну мне например не удобно что вк оборачивает все ссылки в чате в vk.com/away.php?to=, я допустим хочу скопировать сырую короткую ссылку прям из чата. а возможности не имею. Это расширение правда тут не поможет.


      1. 402d
        23.07.2019 13:21

        Здравая параноя имхо должна быть, я бы не доверял скриптам написанных не мною,
        в которых могут произойти не замеченные мною апдейты, имеющие доступ к критичной информации. Не у Всех так все серьезно, как тут конечно
        habr.com/ru/company/digitalrightscenter/blog/460565,
        но имхо не все понимают сколько остальных регистраций может быть скопрометировано
        по цепочке от социалки.


  1. vaut
    23.07.2019 13:03
    +1

    Когда я столкнулся с проблемой перехода в на свой сайт в зоне .ddns.net из ВК, я просто написал в техподдержку ВК. За 2-3 дня меня убрали из блеклиста…


    1. vitaliy2
      24.07.2019 17:25

      Купил юзаный домен, который оказался в ЧС. Написал в ТП — убрали с ЧС тоже в течение нескольких дней.


  1. Klestofer
    24.07.2019 13:02

    Согласно документации, в обработчик события tabs.onCreated() передаётся tab, а не tabId, changeInfo, tab. Из него можно получить URL. Таким образом последующий вызов tabs.query() не понадобится.