網站安全標頭健檢:HSTS、CSP 是什麼?別直接複製設定上線
HTTPS 之外,網站還需要哪些安全標頭?這篇說明 HSTS、CSP、nosniff、frame-ancestors、Referrer-Policy 的作用、檢查方法與導入順序,並解釋為什麼 CSP 應先用 Report-Only 觀察。

網站有 HTTPS,不代表瀏覽器已經知道哪些腳本、圖片、框架與表單目的地可信。
安全標頭是伺服器隨回應送給瀏覽器的規則。它不能取代程式安全,但能增加一層防線。
先用一個指令查看
curl -sI https://example.com
常見項目:
| Header | 作用 |
|---|---|
| Strict-Transport-Security | 後續連線只使用 HTTPS |
| Content-Security-Policy | 限制可載入與執行的來源 |
| X-Content-Type-Options | 避免 MIME sniffing |
| frame-ancestors/X-Frame-Options | 限制網站被其他頁面嵌入 |
| Referrer-Policy | 控制外連時帶出的來源資訊 |
| Permissions-Policy | 控制相機、麥克風等瀏覽器能力 |
「有 Header」只是第一步,值設得太寬鬆也可能沒有實質保護。
HSTS:告訴瀏覽器以後只走 HTTPS
基本語法:
Strict-Transport-Security: max-age=31536000; includeSubDomains
瀏覽器收到後,會在期限內把該網域的 HTTP 嘗試升級為 HTTPS,並拒絕讓使用者略過無效憑證警告。
HSTS 上線前要確認
- 全站與必要子網域都能正常使用 HTTPS
- 自動續期與到期告警已運作
includeSubDomains不會害仍使用 HTTP 的舊子網域中斷- 是否真的符合 preload 條件與長期承諾
HSTS 設很久之後,若憑證過期,使用者反而更難繞過。因此先把 SSL 維運做好,再拉長 max-age。
CSP:建立資源允許清單
CSP 可限制 script、style、image、font、connect、frame 與 form 的來源,降低 XSS、資料注入與 clickjacking 等風險。
簡化概念:
Content-Security-Policy: default-src 'self'; object-src 'none'; frame-ancestors 'self';
但這段不能直接套到每個網站。Google Analytics、YouTube、金流、地圖、客服與 CDN 都可能需要額外來源;WordPress 與頁面編輯器也可能大量使用 inline script/style。
CSP 應先用 Report-Only
OWASP 建議可先以非阻擋模式觀察違規:
Content-Security-Policy-Report-Only: ...
導入順序:
- 盤點第一方與第三方資源。
- 建立初始政策,先用 Report-Only。
- 收集並分類違規報告。
- 修正合法資源與 inline code。
- 小範圍切換 enforced policy。
- 測試登入、表單、付款與後台。
- 持續監控新增第三方服務。
不要為了讓報告變綠,直接加入 *、unsafe-inline、unsafe-eval。過度寬鬆的 CSP 可能只剩形式。
安全標頭不是漏洞掃描替代品
安全標頭無法修復:
- 有漏洞的外掛與套件
- 弱密碼與權限過大
- SQL injection 或認證錯誤
- 未更新的 CMS
- 洩漏的 API key
它是 defense in depth,不是安全保證。健檢報告應分清「缺少一層防線」與「已存在可被利用漏洞」。
常見問題
Q:沒有 CSP 就代表網站不安全嗎?
A: 不能單憑一個 Header 下結論,但缺少 CSP 代表少了一層瀏覽器端限制。仍需搭配程式、權限與更新檢查。
Q:CSP 設好會影響 SEO 嗎?
A: 正確設定通常不會;若誤擋必要 CSS、JavaScript、圖片或結構化內容,可能破壞頁面與使用體驗,所以必須測試。
Q:可以用外掛一鍵設定嗎?
A: 可以協助加入 Header,但工具不知道你的所有合法第三方來源。HSTS 與 CSP 仍需依實際架構調整。
下一步
先執行 curl -sI 盤點現況,再依風險逐步導入。SSL 與 HSTS 應搭配閱讀:SSL 憑證到期與自動續期。
參考來源
想知道你的網站到底漏在哪?
速度、SEO、安全、收信、AI 能見度 —— 3 分鐘免費健檢,把看不見的問題變成看得見的數字。