HTTP 安全標頭是網站在回應瀏覽器時,順手夾帶的一組安全指令,它也是幾乎所有架站教學都會漏掉的一步。少了它,就算你上了 SSL、網址有 https,網站還是等於門沒上鎖。這篇會帶你認識 7 道最該補上的安全標頭分別擋什麼,再用 Cloudflare 不碰主機、不裝外掛、完全免費一次設定完成,最後到 securityheaders.com 驗收成果。要先提醒一件事:其中 X-Frame-Options 這個標頭,會跟 Google 廣告的審核機制打架,有在跑 AdSense 的部落客,後面那段務必看清楚。
上了 SSL 還是不安全?問題出在 HTTP 安全標頭
「我明明上了 SSL、網址也有 https,怎麼用工具一掃還是說我不安全?」這是不少部落客來問我的問題。答案常常出在 HTTP 安全標頭根本沒設。HTTP 安全標頭是網站主機在回應每一次瀏覽器請求時,一起送出的一組規則,用來告訴瀏覽器「哪些行為可以做、哪些要擋下來」,例如禁止別人把你的頁面偷偷包進框架、或強制頁面上的資源都走 https。
說來有點無奈,這件事幾乎所有教 WordPress 架站的部落客和老師都會漏掉,網路上也很少有人專門講。大家在教自架站「資安要怎麼顧」的時候,講來講去就是裝個安全外掛、記得上 SSL,很少有人提到安全標頭這一塊。再加上這個設定藏得深,一般人根本不知道要去哪裡找這個選項,於是結果就是:拿去 securityheaders.com 一掃,幾乎清一色不及格。
要老實說,安全標頭嚴格講不完全等於大家印象中那種防駭客入侵的資訊安全,它比較像是規範瀏覽器行為的網站體質設定。但它確實是落實自架站資安時,最常被整個跳過的一塊。簡單分辨:SSL 負責把連線加密(不懂的話可以看我寫的 免費 SSL 怎麼選),安全標頭則負責管連線之後瀏覽器能做什麼,兩件事不一樣,要分開做。只裝了 SSL 沒設安全標頭,就像大門裝了防盜鎖,窗戶卻全開著。
這 7 道安全標頭各防什麼?
先給結論:這 7 道標頭,每一道都對應一種常見的攻擊手法或隱私外洩,補齊就等於把網站的窗戶一扇扇關上。下面這張表用白話對照,看不懂英文名稱沒關係,看「白話作用」那欄就好。
| 安全標頭 | 設定值 | 白話作用 |
|---|---|---|
| Content-Security-Policy | upgrade-insecure-requests | 把殘留的 http 資源自動升級成 https,避免綠鎖頭破掉 |
| X-Frame-Options | SAMEORIGIN | 不准別的網站把你的頁面包進框架,防點擊劫持(會影響 Google 廣告,下面細講) |
| X-Content-Type-Options | nosniff | 不讓瀏覽器亂猜檔案類型,防偽裝檔案被執行 |
| Referrer-Policy | strict-origin-when-cross-origin | 連到外站時只透露你的網域、不透露完整網址,保護隱私 |
| Permissions-Policy | interest-cohort=() | 拒絕被 Google 抓去做興趣廣告分群(FLoC,現已停用) |
| X-XSS-Protection | 0 | 關掉舊瀏覽器有 bug 的 XSS 過濾,改交給 CSP 處理 |
| Link | remove | 清掉多餘的 Link 標頭,減少不必要的資訊外洩 |
很多人會問我:設了這些會不會把網站拖慢?答案是不會。這些標頭只是回應時多夾幾行文字,幾乎沒有效能成本,更何況用 Cloudflare 設的話,是在它的全球節點上就處理掉了,根本碰不到你的主機。
為什麼部落客用 Cloudflare 設安全標頭最省事?
因為用 Cloudflare 設安全標頭,不用碰主機設定檔、不用裝外掛、完全免費,而且一條規則整站套用,不管你的主機底層是什麼都能用。
網路上少數有教的,多半是叫你去改 .htaccess。但這裡有個大坑:.htaccess 只有 Apache 伺服器吃這套。現在很多主機商和虛擬主機早就改用 Nginx 或 LiteSpeed,這些環境根本沒有 .htaccess 可以改,你照著教學做也是白做,所以一般並不建議走這條路。改主機設定檔則要會登入主機、找對檔案,改錯一個字整站可能就掛掉,對非技術背景的部落客門檻太高;裝安全外掛又多一個外掛要維護、也可能拖慢後台。
Cloudflare 走的是回應標頭轉換規則這條路,設定畫面點一點就好,改錯隨時關掉,網站不會壞,而且它是在連線的最外層處理,跟你主機是 Apache、Nginx 還是 LiteSpeed 完全無關。前提只有一個:你的網域 DNS 已經串接 Cloudflare(很多人為了免費 CDN 跟擋流量早就接了,像我之前也寫過怎麼用 Cloudflare 保護 WordPress 後台)。
如果你是從痞客邦這類平台搬到自架 WordPress 的部落客,安全這塊本來平台會幫你扛,現在得自己顧,安全標頭就是最划算的第一步(整體搬家流程可以參考我整理的 部落格搬家懶人包)。
手把手:在 Cloudflare 設定回應安全標頭
設定方式很單純:進 Cloudflare 後台,建一條回應標頭轉換規則,把 7 道標頭一次加進去就完成。跟著下面做:
- 登入 Cloudflare,從首頁點進你要設定的網域
- 左側選單找到「Rules(規則)」,點進規則總覽頁
- 選擇建立「Response Header Transform Rule(回應標頭轉換規則)」
- 套用範圍選「所有連入的請求」,或填運算式 (ssl) 只對 https 連線生效
- 在動作區逐一新增上面表格那 7 道標頭,設定值照表格填,其中 Link 選「移除(Remove)」、其餘選「設定(Set)」
- 按「部署(Deploy)」儲存,設定立即在全站生效
Cloudflare 一條規則最多可以改 30 個回應標頭,所以這 7 道塞在同一條規則裡綽綽有餘,不用分開建。實際的欄位名稱可以對照 Cloudflare 官方的 回應標頭轉換規則說明,介面更新時名稱可能略有差異,建議讀者自行對照。
有在跑 Google 廣告?X-Frame-Options 這個安全標頭要當心
這是整篇最需要注意的地方:如果你的網站有掛 Google AdSense,X-Frame-Options 設成 SAMEORIGIN 很可能讓你的廣告審核卡住。
原因在於,Google 在審核網站、預覽廣告版位時,會從它自己的網域,用框架(iframe)把你的頁面載進去看。而 SAMEORIGIN 的意思正是「只准我自己的網域把頁面包進框架」,Google 的網域被擋在外面,於是就會跳出經典的「We can’t preview this page because it’s in an IFRAME」錯誤,導致審核過不了或廣告顯示異常。
有掛廣告的部落客,可以這樣處理:
- 審核期間先拿掉這條:等 AdSense 審核通過後再加回去
- 改用 CSP 的 frame-ancestors 指令:保留防護的同時,明確開放 Google 相關網域可以載入你的頁面
- 完全沒在跑廣告的部落客:不受任何影響,X-Frame-Options 照設 SAMEORIGIN 就好,這也是最安全的預設
順帶一提,表格裡的 Permissions-Policy(interest-cohort)雖然名字跟廣告有關,但它管的是拒絕 Google 拿你訪客做興趣分群,而那套 FLoC 技術 Google 已在 2021 年喊停、2022 年從 Chrome 移除,所以現在這條等於沒作用的遺留設定,留著不會出事,但也別期待它有什麼效果。
怎麼確認安全標頭設定成功?用 securityheaders.com 驗收
最快的驗收方式,是到 securityheaders.com 輸入你的網址掃描,看評分有沒有從 F 往 A 走。
這個網站會幫你掃描所有回應標頭,缺哪個、設錯哪個都會一條條列出來,評分從 F(什麼都沒設)到 A 以上。一個全新、沒設過標頭的網站,掃出來幾乎都是 F;把上面 7 道標頭補齊之後,重掃通常就能拉到 A。這個分數本身不是給 Google 排名看的,但它是很直觀的體質檢查表,讓你一眼知道防護到底有沒有生效。
之前我幫一位剛從痞客邦搬到 WordPress 的部落客檢查站台,securityheaders 一掃是 F,七道標頭一個都沒有。用 Cloudflare 照著上面步驟加上去,前後不到十分鐘,重掃就變成 A。設定一次、長期受用,這種 CP 值很高的防護,真的別再漏掉了。
想把整個網站的安全一次顧好,可以參考WordPress 網站安全懶人包,從網站到帳號的防護一次打包。
金城老師觀點
我自己幫部落客檢查站台時,十個有八個 securityheaders 一掃是 F,不是他們不在意,是根本不知道有這回事。安全標頭這種東西平常看不到、出事才知道痛,但它偏偏又是少數設定一次、長期受用的防護,CP 值非常高。我的建議是,把它當成搬完家、上完 SSL 之後的收尾動作,花十分鐘設一設,網站體質立刻不一樣。唯一要記得的就是有跑廣告的話,X-Frame-Options 那條留個心眼,其餘照表抄就對了。
延伸閱讀
參考資料
常見問題
HTTP 安全標頭和 SSL 有什麼不一樣?
SSL 負責把你和訪客之間的連線加密,讓資料傳輸過程不被偷看;安全標頭則是規範連線之後瀏覽器的行為,例如禁止頁面被包進框架、強制資源走 https。兩者互補,上了 SSL 不代表安全標頭就有了,要分開設定。
設定 HTTP 安全標頭需要會寫程式嗎?
用 Cloudflare 的話完全不用。它的回應標頭轉換規則是圖形化介面,照著選標頭、填值、按部署就好。比起改主機的 .htaccess 設定檔,這個方式對沒有技術背景的部落客友善很多。
我有跑 Google 廣告,這些安全標頭會害廣告不能跑嗎?
只有 X-Frame-Options 設成 SAMEORIGIN 這條要注意,它可能讓 AdSense 審核或廣告預覽卡住。解法是審核期間先拿掉、或改用 CSP 的 frame-ancestors 開放 Google 網域。其餘六道標頭都不影響廣告,可以正常設定。
設了安全標頭,網站會變慢嗎?
不會。安全標頭只是回應時多夾幾行文字,幾乎沒有效能負擔。如果用 Cloudflare 設定,更是在它的全球節點就處理完,連你的主機都不會碰到,速度幾乎無感。
我沒有用 Cloudflare,可以設安全標頭嗎?
可以,但會麻煩很多,而且不一定走得通。傳統做法是改 .htaccess,但這只有 Apache 主機能用,現在很多主機是 Nginx 或 LiteSpeed,根本沒有 .htaccess,得直接改主機設定檔或裝外掛代設。對部落客來說,先把網域接上免費的 Cloudflare 再設,是最省事、最不挑主機的做法。

