我正在从我的主页面打开一个弹出窗口,其代码如下:
<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>
您可以看到实时演示here。单击两个链接中的一个以在弹出窗口或新选项卡中打开另一个页面,然后在开启窗口中加载第三个页面。这就是我想要阻止的。
是否有一些技巧可以用来打破开启窗口和打开的窗口之间的连接?理想情况下,打开的窗口不应该知道任何其他窗口都打开了它。
答案 0 :(得分:14)
如果子窗口中的页面在您的控件中,您可以为子页面中的开启者指定null:
window.opener = null;
将此作为javascript中的第一个语句。
如果页面不在您的控件中或位于其他域中,请在打开时执行:
popup = window.open(this.href, '_blank', 'width=512,height=512,left=200,top=100');
popup.opener = null;
答案 1 :(得分:1)
来自doc:
在某些浏览器中,rel =&#34; noopener&#34;原始锚点上的属性 tag将阻止设置window.opener引用。
查看所有支持的浏览器: https://caniuse.com/#search=noopener
此外,对于旧版浏览器,请使用no-referrer: https://mathiasbynens.github.io/rel-noopener/
因此,只要您使用alter procedure [dbo].[sp_ClientCount] (
@DateFrom as datetime,
@DateTo as datetime,
@ClientCount as int = null
)
as
begin
if @ClientCount IS NULL
return 0
select count(ClientID)
from tblClients
where ClientID IN (
select ClientID
from tblReqPayment
where somedate between @DateFrom and @DateTo
group by ClientID
having count(*) = @ClientCount
)
end
rel="noreferrer noopener"