什麼是 HSTS?

HSTS(HTTP Strict Transport Security)是一個 HTTP 回應標頭,指示瀏覽器在指定時間內,對這個網域只能使用 HTTPS 連線,絕對不使用明文 HTTP。瀏覽器一旦看過這個標頭,之後造訪時會自動將 HTTP 升級成 HTTPS,且若無法建立有效的 HTTPS 連線,會拒絕載入頁面。

HSTS 解決的問題

就算網站已將所有 HTTP 流量重新導向 HTTPS,第一個請求仍存在漏洞。使用者在瀏覽器輸入 example.com(不加 https://),瀏覽器會先嘗試 http://example.com。在公共 Wi-Fi 等有問題的網路上,攻擊者可以攔截這個 HTTP 請求,偽裝成伺服器回應,在重新導向到 HTTPS 發生之前就建立中間人位置。這種攻擊稱為 SSL stripping。

HSTS 告訴瀏覽器:「下次造訪這個網站,直接用 HTTPS,不要發送任何 HTTP 請求。」

HSTS 標頭格式

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

指令說明
max-age瀏覽器記住 HSTS 政策的秒數。31536000 = 一年。必填。
includeSubDomains將政策套用到所有子網域。選填,強烈建議加入。
preload表示申請加入瀏覽器的 HSTS 預載清單。選填,需謹慎使用。

實際運作流程

  1. 訪客第一次透過 HTTPS 連線到你的網站,伺服器回傳 HSTS 標頭。
  2. 瀏覽器儲存 HSTS 政策:「接下來一年,連線這個網域都要用 HTTPS。」
  3. 同一訪客下次在網址列輸入網域,瀏覽器在發送任何網路請求之前,就在內部將連線升級為 HTTPS。
  4. 若無法建立有效的 HTTPS 連線(憑證過期、主機名稱不符),瀏覽器顯示錯誤並拒絕載入,且沒有「繼續前往」的選項。

HSTS Preload 預載清單

從未造訪過你網站的使用者,瀏覽器還沒看過 HSTS 標頭,第一次連線仍可能被攻擊。

瀏覽器廠商維護了一份硬編碼的 HSTS 預載清單。若你的網域在清單上,瀏覽器從第一次造訪就強制使用 HTTPS,無需先看到標頭。Chrome、Firefox、Safari、Edge 都使用 hstspreload.org 維護的同一份清單。

加入預載清單的條件:max-age 至少 31536000、包含 includeSubDomains、包含 preload 指令,且所有子網域都提供有效 HTTPS。

注意:預載是難以撤銷的。一旦加入清單,移除可能需要數個月才能傳遞到所有瀏覽器版本。只在你確信能長期維持全站 HTTPS 的情況下才申請。

實際試試看:安全標頭掃描器 → 檢查網站是否已啟用 HSTS