HTML a標籤打開新標籤頁避免出現安全漏洞,請使用“noopener”
新標籤頁中打開一個網址如何出現安全漏洞
讓我們在網站上的新標籤頁中打開一個網址,HTML如下
<a href="https://malicious-domain.netlify.com" target="_blank"> 訪問惡意網站! </a>
這裏我們有一個指向惡意網站的 href
屬性,並以 _blank
屬性爲 target
,使其在新標籤頁中打開。
該流程看起來如此簡單明瞭,用戶在這裏可能面臨的安全風險是什麼?
用戶從你的頁面重定向到域,此時,瀏覽器會將你當前網站的所有 window
變量內容附加到惡意網站的 window.opener
變量。現在惡意網站可以訪問你網站的 window
,這顯然在重定向此方法時打開了一個 安全漏洞 。
惡意網站一旦通過 window.opener
訪問了你的網站的 window
變量,它可以將你之前的網站重定向到一個新的 釣魚網站 ,這個網站可能與你打開的實際網站相似,甚至可能會要求你再次登錄。
在惡意網站中,只需編寫以下代碼即可完成上述修改
if (window.opener) { window.opener.location = 'https://www.dhilipkmr.dev'; }
因此,無辜用戶將陷入此陷阱,並提供可能暴露給攻擊者的登錄詳細信息。
我們如何避免這種情況?
一種簡單的方法是將帶有 noopener
的 rel
屬性添加到 <a>
標記。
<a href="https://malicious-domain.netlify.com" rel="noopener" target="_blank"> 訪問惡意網站! </a>
它有什麼作用?
rel = "noopener"
表示瀏覽器不要將當前網站的 window
變量附加到新打開的惡意網站。
這使得惡意網站的 window.opener
的值爲 null
。
因此,在將用戶導航到你未維護的新域時,請當心。
並非總是我們用標籤打開一個新標籤,在某些情況下,你必須通過執行javascript的 window.open()
來打開它,如下所示:
function openInNewTab() { // 一些代碼 window.open('https://malicious-domain.netlify.com'); }
<span class="link" onclick="openInNewTab()">訪問惡意網站!</span>
這裏沒有提及 noopener
,因此這導致當前網站的 window
傳遞到惡意網站。
通過js打開新標籤頁時,該如何處理?
function openInNewTabWithoutOpener() { var newTab = window.open(); newTab.opener = null; newTab.location='https://malicious-domain.netlify.com'; }
<span class="link" onclick="openInNewTabWithoutOpener()">訪問惡意網站!</span>
我們已經通過 window.open()
打開了一個虛擬標籤,該標籤打開了 about:blank
,因此這意味着它尚未重定向到惡意網站。
然後,我們將新標籤的 opener
值修改爲 null
。
將我們將新標籤的網址修改爲惡意網站的網址。
這次, opener
再次爲空,因此它無法訪問第一個網站的 window
變量。
問題解決了。
但是在舊版本的Safari中將無法使用此方法,因此我們再次遇到問題。
如何解決Safari的問題?
function openInNewTabWithNoopener() { const aTag = document.createElement('a'); aTag.rel = 'noopener'; aTag.target = "_blank"; aTag.href = 'https://malicious-domain.netlify.com'; aTag.click(); }
<span class="link" onclick="openInNewTabWithoutOpener()">訪問惡意網站!</span>
在這裏,我們模擬點擊錨標記。
-
我們創建
<a>
標記並分配所需的屬性,然後在其上執行click()
,其行爲與單擊鏈接相同。 -
不要忘記在此處向標籤添加
rel
屬性。
其他事實:
-
CMD + LINK window.opener null
-
但是,在通過JavaScript處理新標籤頁打開的元素上的
CMD + LINK
上,瀏覽器將附加窗口變量並將其發送到新標籤頁。 -
默認情況下,新版的Safari會在所有情況下刪除
window.opener
,要將窗口信息傳遞給新的標籤頁,你必須明確指定rel='opener'
。
沒有人可以繞過你的"保安"。
推薦閱讀
· 9個很棒的CSS邊框技巧
· macOS和HomeBrew的12個終端提示和技巧
· Next.js和Nuxt.js的語法比較
· 新手React開發人員容易做錯的5件事
· Chrome瀏覽器終可以對標籤進行整理和分組了
· 7個很棒的JavaScript產品步驟引導庫
· 2020年排名前11位的靜態網站生成器
· 讓你在2020年成爲前端大師的9個項目
點個在看唄