名詞解釋

什麼是點擊劫持?把透明頁面疊在另一個頁面上、誘導你按下其中按鈕的攻擊

點擊劫持是把真實頁面變透明、疊在另一個網站上,誘導使用者點擊看不見的按鈕(轉帳、修改設定等)的攻擊。圖解原理,並說明用 CSP frame-ancestors 與 X-Frame-Options 防止被他站嵌入。

發布於 2026-06-10 更新於 2026-10-06 閱讀時間 3 分鐘
本頁內容

點擊劫持會誘導你按下藏在可見頁面下方的另一個頁面的按鈕。本文講解其原理與可靠的防禦方法(不公開攻擊步驟)。

什麼會被盯上

「一鍵即可完成、而且有價值的操作」是攻擊目標。

容易被盯上的操作為什麼會被盯上
轉帳、購買的確認一鍵即可讓金錢發生流動
修改設定(可見範圍、授權許可)之後會導致帳號被接管或資訊被取得
OAuth/權限的「允許」按鈕被擅自批准帳號關聯授權
社群媒體的追蹤、按讚、發文被濫用於擅自傳播、刷讚

為什麼會成立(原理)

瀏覽器可以用 iframe 載入另一個網站並疊加顯示。攻擊者把這個 iframe 設為透明(不透明度為 0),使用者看到的只有放在下方的假 UI。使用者按下「假按鈕」時,從座標上看,正疊加在其上方的真實按鈕就被按下了。

攻擊者的頁面「您中獎了!請按下方按鈕」
= 疊加著透明的 iframe(真實的銀行/設定頁面)
↓ 使用者按下「看得見的假按鈕」
實際被按下的是正上方真實的「執行」按鈕
↓ 在本人已登入的狀態下
轉帳、修改設定、授權作為「本人的操作」完成
在攻擊者的頁面上把真實網站透明疊加,看得見的只有假 UI。點擊實際落在透明的真實頁面上。

它與 CSRF 相似,但 CSRF 是「在背後傳送請求」,而點擊劫持是讓本人去操作真實的畫面,因此僅靠一次性權杖等 CSRF 對策無法防禦。

實際案例:瀏覽器外掛程式的權限對話框(2008)

2008 年 10 月,Adobe 針對一個影響多種瀏覽器的點擊劫持問題,發布了安全公告(APSA08-08)。根據媒體報導,網站可以把 Flash Player 的設定對話框隱形疊加,讓使用者在不知不覺中授予網站使用攝影機與麥克風的權限。Adobe 發布了修正版的 Flash Player,並作為暫時的因應方式,建議使用者在設定管理員中選擇「永遠拒絕」。

教訓是:被盯上的不只是轉帳按鈕。任何只要點一下就交出權限的畫面(「允許」「同意」「連結」)都在範圍內。MITRE 把這個弱點分類為 CWE-1021(Improper Restriction of Rendered UI Layers or Frames)。

防禦:不讓他站嵌入自己的網站

1

設定 CSP frame-ancestors(最優先)

在回應標頭中加入 Content-Security-Policy: frame-ancestors 'self'(僅允許自己的網站框架化)。如果不需要讓第三方嵌入,用 'none' 最安全。只有在確有需要允許的對象時才逐一列出網域。

2

同時使用 X-Frame-Options(向後相容)

為了照顧老舊環境,也加上 X-Frame-Options: DENY(或 SAMEORIGIN)。這樣新舊瀏覽器都能涵蓋。

3

對重要操作加上確認步驟

轉帳、授予權限等致命操作,要插入二次認證、確認對話框、操作前的意圖確認。這樣透明疊加就更難突破。

4

把工作階段 Cookie 設為 SameSite

用 SameSite=Lax/Strict 抑制來自其他網站的自動傳送。它對點擊劫持本身並非萬能,但能削弱相關的各類「源自他站的操作」。

X-Frame-Options 與 CSP frame-ancestors 的區別

兩個標頭都能阻止他站嵌入你的網站,但細節不同。

X-Frame-OptionsCSP frame-ancestors
值DENY(全部禁止)/ SAMEORIGIN(僅限同源)'none' / 'self' / 允許的網域清單
允許多個嵌入者不行(ALLOW-FROM 在現代瀏覽器中無效)可以
用 meta 標籤設定沒有效果沒有效果
兩者同時存在時支援的瀏覽器會忽略它優先套用
角色給舊瀏覽器的備援現在的主要防禦

兩者都送出時,請讓意思一致:frame-ancestors 'none' 配 DENY,frame-ancestors 'self' 配 SAMEORIGIN。

常見的設定錯誤

  • 以為 CSP 的 default-src 會涵蓋它。frame-ancestors 不會退回使用 default-src。即使設了 default-src 'none',只要沒寫 frame-ancestors,嵌入仍然是允許的
  • 寫在 meta 標籤裡:<meta http-equiv> 在這裡沒有效果,請以回應標頭送出
  • 停留在 Content-Security-Policy-Report-Only:它只會回報違規,不會阻止嵌入。確認運作正常後,請改用強制執行的標頭
  • 只在部分頁面設定:常見的情況是檢查了首頁,卻漏了登入頁、設定頁或錯誤頁。也請確認 CDN 或代理沒有把標頭拿掉

如何檢查自己的網站

1

用標頭檢測工具確認

在安全標頭檢查中輸入你網站的 URL,確認是否回傳 X-Frame-Options 與 CSP 的 frame-ancestors。不只檢查首頁,也要檢查登入後的設定頁,以及轉帳或授予權限的頁面。

2

用瀏覽器的開發者工具確認

開啟「網路」分頁並重新載入頁面,查看 HTML 回應的標頭。也確認標頭沒有被重複送出,或送出互相矛盾的值。

3

在一個地方設定

在一個地方(nginx 或 Caddy 等 Web 伺服器、反向代理,或框架)對所有回應加上它,就能同時避免遺漏與重複。如果要寫新的 CSP,CSP 產生器可以組出包含 frame-ancestors 的設定。

本站的觀點:一行回應標頭最有效,先檢查自己的網站

點擊劫持的對策不是複雜的程式碼,而是用一到兩行回應標頭禁止嵌入。在框架或反向代理(Caddy/nginx)上對所有頁面統一加上,杜絕遺漏。最常見的失誤,是自以為已經設定好、實際上卻漏掉的標頭,所以設定之後,請用上面的步驟確認它真的有被回傳。

出處(一手資料)

  • OWASP「Clickjacking Defense Cheat Sheet」— cheatsheetseries.owasp.org(frame-ancestors、X-Frame-Options、SameSite;ALLOW-FROM 已失效;meta 標籤沒有效果;frame busting 的限制)
  • MDN「CSP: frame-ancestors」— developer.mozilla.org(可用的值、不退回 default-src、meta 不支援)
  • RFC 7034「HTTP Header Field X-Frame-Options」— rfc-editor.org
  • IPA「安全なウェブサイトの作り方 1.9 クリックジャッキング」(日文)— ipa.go.jp
  • Adobe「Security Advisory for Flash Player (APSA08-08)」(2008 年 10 月 7 日)— adobe.com
  • Computerworld「Clickjackers could hijack webcams, microphones, Adobe warns」(2008 年 10 月)— computerworld.com(攝影機與麥克風的權限對話框是攻擊目標)
  • MITRE「CWE-1021: Improper Restriction of Rendered UI Layers or Frames」— cwe.mitre.org

接下來閱讀

分類編號

CWE 對造成漏洞的弱點類型進行分類,MITRE ATT&CK 對攻擊者的技術進行分類。兩者皆由 MITRE 維護,廣泛用於標註漏洞資訊與偵測規則。

CWE™: Copyright © 2006–2026, The MITRE Corporation. CWE is a trademark of The MITRE Corporation. The MITRE Corporation hereby grants you a non-exclusive, royalty-free license to use CWE for research, development, and commercial purposes. Any copy you make for such purposes is authorized on the condition that you reproduce MITRE’s copyright designation and this license in any such copy. CWE Terms of Use

FAQ

Q點擊劫持會讓人遭受什麼?
A

使用者「自以為」按下的點擊,實際落在了疊加於背後那個真實頁面的按鈕上。一鍵轉帳、修改設定、授予權限、在社群媒體上追蹤/按讚、同意按鈕等「一鍵即可完成的重要操作」都會被濫用。它的特點不是竊取密碼,而是讓已登入的使用者本人去執行操作。

Q最有效的防禦是什麼?
A

就是「不讓自己的網站被嵌入到他站的框架(iframe)裡」。在回應標頭中把 CSP 的 frame-ancestors 設為 'self'(或僅允許指定網域),並為了向後相容同時使用 X-Frame-Options: DENY。這樣攻擊者就無法進行疊加。

Q只靠 JavaScript 的 frame busting(跳出框架)夠嗎?
A

不夠。舊式的「如果發現自己在 iframe 內就跳出去」的 JS 有很多繞過手法,且在 JS 被停用時無法防護。可靠的防禦是用伺服器端的回應標頭(frame-ancestors / X-Frame-Options),讓瀏覽器直接拒絕被嵌入。

QX-Frame-Options 和 CSP frame-ancestors,該用哪一個?
A

兩者都送出,並讓意思一致;這是標準做法。frame-ancestors 可以列出多個允許嵌入的對象,兩者同時存在時,支援它的瀏覽器會套用 frame-ancestors。X-Frame-Options 則是給舊瀏覽器的備援。'none' 配 DENY,'self' 配 SAMEORIGIN。

Q可以用 HTML 的 meta 標籤設定嗎?
A

不行。frame-ancestors 寫在 meta 元素中沒有效果,X-Frame-Options 寫在 meta 元素中也會被忽略。兩者都必須以 HTTP 回應標頭送出,在 Web 伺服器、反向代理或框架中設定。

Q如果需要讓自己的其他網站或合作夥伴嵌入頁面,該怎麼辦?
A

在 frame-ancestors 中列出允許的對象(例如 frame-ancestors 'self' https://partner.example)。X-Frame-Options 的 ALLOW-FROM 在現代瀏覽器中無效,不要靠它來做允許清單。只對真正需要嵌入的頁面與網域開放權限。