新標籤頁中打開一個網址如何出現安全漏洞

讓我們在網站上的新標籤頁中打開一個網址,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';
}

因此,無辜用戶將陷入此陷阱,並提供可能暴露給攻擊者的登錄詳細信息。

我們如何避免這種情況?

一種簡單的方法是將帶有 noopenerrel 屬性添加到 <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個終端提示和技巧

·  30種不同的編程語言怎麼寫“Hello, World”

·  玩轉 Terminal 終端:入門指南及進階技巧

·  6個很棒的Webpack插件提高您的生產力

·  Next.js和Nuxt.js的語法比較

·  新手React開發人員容易做錯的5件事

·  Chrome瀏覽器終可以對標籤進行整理和分組了

·  7個很棒的JavaScript產品步驟引導庫

·  2020年排名前11位的靜態網站生成器

·  讓你在2020年成爲前端大師的9個項目

點個在看唄

相關文章