魯斯前端布魯斯前端

文章中英模式

布魯斯前端面試題目 - 如何正確開啟外部連結

掌握在新分頁中安全開啟外部連結的完整指南,了解target、rel屬性的正確使用,以及如何防範安全風險和改善使用者體驗。

影片縮圖

懶得看文章?那就來看影片吧

安全隱患與解決方案

僅使用target="_blank"開啟外部連結存在安全隱患。新開啟的頁面可以通過window.opener訪問原頁面的window對象,這可能導致鏈接劫持(tabnabbing)攻擊。

潛在風險示例

// 在惡意網站上可能執行的代碼
if (window.opener) {
  // 可以訪問原頁面的window對象
  window.opener.location = 'https://malicious-site.com/fake-login.html';
  
  // 用戶返回原標籤頁時,可能已被重定向到釣魚頁面
}

為防止這種情況,應該始終在開啟外部連結時添加rel="noopener noreferrer"屬性:

<a 
  href="https://example.com" 
  target="_blank" 
  rel="noopener noreferrer"
>
  安全地訪問外部網站
</a>

rel="noopener"

  • 1. 阻止新開窗口訪問window.opener
  • 2. 防止鏈接劫持攻擊
  • 3. 現代瀏覽器在使用target="_blank"時默認添加

rel="noreferrer"

  • 1. 防止在請求頭中發送Referer信息
  • 2. 增強隱私保護,不透露來源網站
  • 3. 提供對較舊瀏覽器的向後兼容性

🔥 常見面試題目

(一) target="_blank"存在什麼安全隱患?如何解決?

答:使用target="_blank"開啟連結時存在以下安全隱患:

  1. 1. 窗口引用漏洞:新頁面可以通過window.opener訪問原頁面,甚至可以修改原頁面的URL。
  2. 2. 性能問題:新頁面與原頁面共享處理程序,可能影響原頁面性能。
  3. 3. Referer信息洩露:可能洩露用戶來源網站信息。

解決方案:添加rel="noopener noreferrer"屬性

<!-- 不安全的寫法 -->
<a href="https://example.com" target="_blank">訪問外部網站</a>

<!-- 安全的寫法 -->
<a href="https://example.com" target="_blank" rel="noopener noreferrer">訪問外部網站</a>

說明

  • noopener:使window.opener返回null,防止鏈接劫持。
  • noreferrer:防止發送Referer頭信息,保護隱私。