Как отключить всплывающее окно JavaScript от opener

Я открываю всплывающее окно с моей главной страницы с таким кодом:

<a href="http://external.domain.tld/"
   onclick="window.open(this.href, '_blank', 
       'width=512,height=512,left=200,top=100');return false">
 Open popup
</a>

это отлично работает, но моя проблема в том, что документ, загруженный во всплывающее окно, имеет разрешение изменить местоположение окна открывания. Это даже работает, когда документ во всплывающем окне из другого домена. Он не имеет разрешения на чтение местоположения, но ему разрешено изменять местоположение. Я не хочу этого. Я хочу, чтобы всплывающее окно было полностью отключено от моего основного страница.

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

<a href="http://external.domain.tld/" target="_blank">
  Open in new tab
</a>

это код в открывшемся документе, который не должен быть разрешен:

<script>
  opener.location.href = "http://badsite.tld/";
</script>

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

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

2 ответов


Если страница в дочернем окне находится под вашим контролем, вы можете назначить null открывателю на дочерней странице:

window.opener = null;

сделав это как первый оператор в JavaScript.

Если страница не находится под вашим контролем или находится в другом домене, сделайте это при открытии:

popup = window.open(this.href, '_blank', 'width=512,height=512,left=200,top=100');
popup.opener = null;

от doc:

в некоторых браузерах атрибут rel="noopener" на исходном якоре тег предотвратит окно.ссылка открывателя из набора.

просмотреть все поддерживаемые браузеры: https://caniuse.com/#search=noopener

кроме того, для старых браузеров используйте no-referrer: https://mathiasbynens.github.io/rel-noopener/

таким образом, исправление do rel="noreferrer noopener" где вы используете target="_blank"