Defaults.Exposed

Defaults.Exposed修復 › 點擊劫持防護(X-Frame-Options)

如何修復 點擊劫持防護(X-Frame-Options)

這是一條簡單的指令,告訴瀏覽器不允許別的網站偷偷把你的網站載入到它們自己的頁面裡。少了它,騙子就能把你真實的、已登入的頁面藏在一個假頁面後面,誘騙你的客戶點擊他們根本不打算點的東西——批准一筆付款、修改密碼、授予權限。

對您業務的關鍵影響: 詐騙者可以神不知鬼不覺地把你正在運營的網站套進一個假頁面裡,從已登入的客戶那裡偷走錢或帳戶權限——而在客戶眼裡,這一切像是你的網站干的。修復是免費的,開發人員大約 15 分鐘就能搞定;不加這條防護是一個已知漏洞,犯罪分子和謹慎的買家都能在幾秒鐘內發現。

這會讓您付出什麼代價

為什麼它重要。 這是一項免費、只需一行、幾分鐘就能加上的設定,卻能堵住一整類針對你已登入客戶的伎倆。在我們的評分中,它是一項實打實得分的網頁安全檢查,定為高嚴重級,因為缺失這條回應標頭會留下一個已知且極易被發現的漏洞,犯罪分子會自動化利用,買家也會專門去看。

一句話說清這是什麼

當有人訪問你的網站時,他們的瀏覽器也可以被指示把你的網站載入到另一個網站裡面——就像在一個大頁面裡嵌入一個小視窗。這聽上去沒什麼害處,有時確實如此。但這正是一種叫點擊劫持的攻擊所依賴的機制。

訣竅是這樣的。騙子建好自己的頁面,悄悄把你真實的網站載入進去——隱形的,被設成完全透明。然後他們在上面鋪上自己的內容:一個炫目的按鈕、一個播放影片、一個領取你的獎品。你的客戶看到的是攻擊者的頁面,點的是看上去無害的按鈕。但因為你真實的網站正隱形地躺在他們滑鼠的下方,這一點其實落在了你的頁面上——確認一筆付款、修改密碼、批准存取、接受一項權限。客戶以為點了這個;其實點的是另一個,而且是在一個他們信任的網站上。

點擊劫持防護是你網站發給每位訪客瀏覽器的一條簡短、隱形的指令,意思大致是:

不要讓別的網站把我載入到它們內部。如果有誰這麼干,拒絕它。

現代瀏覽器會自動遵從這條指令。一旦開啟,這套伎倆就直接失效——被嵌入的那份你網站的副本拒絕載入。不開的話,你的網站就成了詐騙裡那一層隱藏頁面的現成素材,而上當的客戶會把整件事聯想到你的品牌,而不是攻擊者的。

這會讓你付出什麼代價

下面是真實、日常的場景。我們從不點名任何真實企業;這些只是說明這個漏洞會被怎樣利用。

  1. **隱形的確認。**客戶在一個標籤頁裡登入著你的帳戶入口。他們落到某個頁面(來自廣告、郵件、搜尋結果),上面承諾了某種誘人的東西,並顯示一個大大的繼續按鈕。藏在那個按鈕下方的,是從他們自己已登入的工作階段裡載入出來的你真實的確認轉帳或修改信箱控件。他們點擊繼續——卻在不知情中授權了對他們與你之間真實帳戶的一項變更。在他們和你的客服團隊看來,都像是他們你的網站上自己做的。

  2. **設定被劫持。**攻擊者把你的帳戶設定頁套進框架,再疊上一個無害的小遊戲或問卷。在恰當位置點幾下,就悄悄翻轉了一項設定——把攻擊者的信箱加為找回地址、授予某個應用程式權限、或關閉一條安全告警。帳戶就此被悄無聲息地攻破,而當時一切看上去都沒問題。

  3. **拖住的交易。**一個較大的客戶在簽約前發來他們標準的安全問卷。其中一行問你的網站是否設置了防嵌入保護(X-Frame-Options / CSP frame-ancestors)。你的 IT 聯絡人只能回答沒有,於是採購流程暫停,你手忙腳亂地去補一個免費、15 分鐘的設定——而它如今在買家面前看起來像個危險信號。

  4. **品牌淪為誘餌的活動。**因為你真實、被信任的頁面可以被嵌入,攻擊者就把你的登入或結帳頁當作更大規模網路釣魚活動裡那層最有說服力的頁面。上當的客戶不會怪那個隱於幕後的攻擊者——他們記住的是你的網站讓他們被騙的那一次。

  5. **稽核被點名。**保險公司的掃描,或審查你安全狀況的稽核方,把缺失的點擊劫持防護列入發現項。這是教科書級的基礎安全條目;被它點名,說明那些簡單、免費的防護沒有到位——而這會影響外界對你其餘安全狀況的評判。

貫穿始終的一點:傷害落在一個真實的、已登入的客戶身上,他做了自己本不打算做的事——而這件事掛的是你的名字,不是攻擊者的。

它實際上是什麼

當瀏覽器向你的網站請求一個頁面時,你的伺服器會連同頁面一起回送一些隱形的回應標頭——瀏覽器會讀取、但訪客永遠看不到的額外指令。點擊劫持防護就是透過這些回應標頭來傳遞的。一共有兩條,只要存在其中一條,我們的檢查就通過:

1. 較老的回應標頭——X-Frame-Options

X-Frame-Options: SAMEORIGIN

這是長期以來、被廣泛支援的控制。它取兩個實用取值之一:

2. 現代的回應標頭——Content-Security-Policy 的 frame-ancestors

Content-Security-Policy: frame-ancestors 'self';

這是更新、更靈活的控制,也是現行標準所指向的那一個。它做的是同樣的工作,但讓你能精確指定可以嵌入你:

良好的狀態長什麼樣

最穩妥的做法是兩者都用:用 frame-ancestors 服務現代瀏覽器(並藉助它精確指定允許的嵌入者),再用 X-Frame-Options: SAMEORIGIN 作為舊用戶端的兜底。我們的檢查只要有其一即可通過——但既然兩者都免費、所花時間也一樣,沒理由不都設上。

有一個細節你的開發人員應該知道:Content-Security-Policy-Report-Only 回應標頭不會強制執行任何東西——它只上報。如果你想讓點擊劫持防護真正生效,它必須來自一個強制執行的回應標頭(一條普通的、帶 frame-ancestorsContent-Security-Policy,或 X-Frame-Options),而不是僅上報的那個。

如何修復(免費,約 15 分鐘)

**把這一節交給負責你網站的人——你的 IT 人員、網頁開發人員或主機服務商。修復是免費的。**它無非是一兩條回應標頭,或 CDN 裡的一條規則。沒有任何東西要花錢買。

只要存在一條 X-Frame-Options 回應標頭(設為 DENYSAMEORIGIN一條 CSP 的 frame-ancestors 指令,檢查就通過。推薦的雙保險做法是兩者都加。

第一步——決定要多嚴

第二步——添加回應標頭(選你的平台)

Nginx——在你的 server 區塊內:

add_header X-Frame-Options "SAMEORIGIN" always;
add_header Content-Security-Policy "frame-ancestors 'self';" always;

Apache——確認已啟用 mod_headers,然後在你的虛擬主機中:

Header always set X-Frame-Options "SAMEORIGIN"
Header always set Content-Security-Policy "frame-ancestors 'self';"

Microsoft IIS——在 web.config<customHeaders> 內:

<add name="X-Frame-Options" value="SAMEORIGIN" />
<add name="Content-Security-Policy" value="frame-ancestors 'self';" />

**Cloudflare(或類似的 CDN):**進入 Rules → Transform Rules → Modify Response Header,添加兩條規則,對所有回應把 X-Frame-Options 設為 SAMEORIGIN、把 Content-Security-Policy 設為 frame-ancestors 'self';。如果你沒有直接的伺服器存取權限,這是最簡單的路子。

**已經因為其他原因在發送 Content-Security-Policy?**不要再建第二條 CSP 回應標頭——把 frame-ancestors 加進你現有的策略裡。兩條 CSP 回應標頭可能彼此衝突。

**網站建站平台(Squarespace、Wix、Shopify 等):**這些平台往往會替你設好防嵌入保護,所以你可能已經通過、什麼都不用做。如果我們的檢查標記了它,相關控制通常在平台的安全設定裡,或者你可以在網站前面的 CDN 上加。(注意:Google Workspace 和 Microsoft 365 驅動的是你的信箱,不是你的網站——這條回應標頭要設在你公開網站實際所在的地方,而不是 Workspace/365 的管理後台。)

第三步——重載並驗證

重載 Web 伺服器或部署 CDN 規則,然後打開你正式運營的網站,檢查回應標頭——瀏覽器開發者工具 → 網路(Network)標籤頁 → 點擊頁面請求 → 回應標頭(Response Headers),或用任意免費的回應標頭檢查工具。確認這些回應標頭出現在真實的頁面回應上,而不僅僅是首頁。然後重新執行檢查。

常見錯誤

常見問題

我不懂技術——我自己能處理嗎?

技術部分不用你來做。這只是在你網站的伺服器或 CDN(內容傳遞網路)上加一條設定,任何網頁開發人員或 IT 服務商幾分鐘就能加好。把下面的如何修復一節交給他們——裡面寫清楚了要加什麼。修復是免費的;只有在你希望我們持續監控它是否一直生效時,我們才收費。

這會不會讓我自己的網站、或正當合作夥伴無法顯示我的頁面?

只有設得太嚴才會。常用的設定(SAMEORIGIN,或 frame-ancestors self)仍允許你自己的網站正常嵌入自己的頁面——它只擋外部網站。如果某個真正的合作夥伴需要嵌入你某一個特定頁面,你的開發人員可以單獨放行那一個來源,同時繼續擋住其他所有人。

我們是小企業——真的會有人來盯上我們嗎?

這類攻擊是由自動化工具批量發起的,不是逐個挑選目標。小網站常常恰恰因為缺少這類基礎防護才中招。攻擊者不需要知道你是誰——他們只需要你的網站可以被嵌入。堵上這個漏洞不花你一分錢。

良好的狀態到底長什麼樣?

要麼是設為 SAMEORIGIN(或 DENY)的 X-Frame-Options 回應標頭,要麼是帶有 frame-ancestors 指令的 Content-Security-Policy——理想情況下兩者都有。只要有其中一個,我們的檢查就通過。更現代、更靈活的控制是 frame-ancestors;X-Frame-Options 是更老的回應標頭,仍能涵蓋一些舊瀏覽器,所以雙保險的做法是兩者都設。

這跟 SSL 小鎖或 HTTPS 不是一回事嗎?

不是——它們防的是完全不同的東西。HTTPS(加密傳輸)給連線加密,讓別人無法在傳輸途中讀取它。點擊劫持防護則是從根本上阻止你的頁面被載入到別人的網站裡。你可以有一把完美的小鎖,卻仍然對點擊劫持門戶大開。它們是兩項獨立的檢查,你兩者都要。

如果我們不修,會拉低評分嗎?

會。這是一項計分的網頁安全檢查,不是提示性的——缺失這條回應標頭會扣分,並定為高嚴重級,因為它直接把你已登入的客戶暴露在欺詐之下。它也是最便宜能補回來的分數之一:一條免費的回應標頭,開發人員約 15 分鐘。