Опасный target=»_blank»

Дата : 29 Август, 2017
Опубликовал bi3ks
1 Star2 Stars3 Stars4 Stars5 Stars (Проголосуй первым!)
Загрузка...
Теги : SEO

Большинство создают внешние ссылки через target=»_blank» и не знают одного интересного нюанса — страница, на которую мы попадем таким образом, получит частичный контроль над ссылающейся на нее страницей через js свойство window.opener.

Через window.opener.location мы сможем сделать редирект на, к примеру, фишинговую страницу. Это своего рода tabnabbing, только более продвинутый. Так как жертва меньше всего ожидает подмены страницы, в открытой ранее, доверенной вкладке браузера.

Проблема далеко не новая, но до сих пор актуальная, и как вижу, не многие о ней знают.

Проблема так же существует в facebook. 

Для примера — открываем пост, кликаем по ccылке. Смотрим что случилось с вкладкой, на которой мы открывали данный пост.

Скрыл публикацию в FB ввиду жалоб на надобность восстанавливать доступ к аккаунту после перехода по ссылке (пруф). Можно самому попробовать разместить скрытую публикацию на страницу sli.su/kitten.html либо посмотреть как это работает на хабре

На странице sli.su/kitten.html есть такой код:

<code class="javascript hljs"><span class="hljs-built_in">window</span>.opener.location = <span class="hljs-string">'https://sli.su/facebook.com/auth.html'</span>;
</code>

Он создает редирект с ранее доверенной страницы. Это происходит потому, что браузеру никто не сообщил, что открываемая страница не должна иметь доступа к родительской вкладке. На момент публикации без проблем отрабатывает в chrome 50, firefox 45, opera 36.

Таким грешат многие сайты, а некоторые, даже не считают это за проблему «на своей стороне» sites.google.com/site/bughunteruniversity/nonvuln/phishing-with-window-opener

Варианты решения проблемы:

1. Добавить в ссылки:

<code class="html hljs xml">rel="noopener"
</code>

Это так же может быть

<code class="html hljs xml">rel="nofollow noopener"
</code>

2. Открывать все внешние ссылки через свою, промежуточную страницу, на которой должен отработать код:

<code class="javascript hljs"><span class="hljs-built_in">window</span>.opener = <span class="hljs-literal">null</span>;
</code>

3. Открывать ссылки в новой вкладке через js:

<code class="javascript hljs"><span class="hljs-keyword">var</span> otherWindow = <span class="hljs-built_in">window</span>.open();
otherWindow.opener = <span class="hljs-literal">null</span>;
otherWindow.location = targetUrl;
</code>

4. Отлавливать все клики по ссылкам и в момент перехода создавать скрытый iframe, через который и делать открытие страницы в новой вкладке. github.com/danielstjules/blankshield — js плагин который, по описанию, решает поставленную задачу (лично не тестировал).

P.S.: В FF не работает rel=«noopener» — habrahabr.ru/post/282880/#comment_8879594. Вместо него можно использовать rel=noreferrer.