使用嚴格的 HSTS 政策

HTTP 等純文字通訊協定容易遭受竊聽攻擊,攻擊者可以讀取傳輸內容。傳輸層安全標準 (TLS) 可加密流量,讓攻擊者即使擷取到資料,也難以使用。

不過,攻擊者可能會強制加密連線使用純文字 HTTP,藉此規避 TLS。如要解決這個問題,可以使用 HTTP 嚴格傳輸安全性 (HSTS) 回應標頭。HSTS 會強制使用者的瀏覽器透過 TLS 造訪網站,且在一段時間內不允許瀏覽器改用純文字 HTTP。

Browser Support

  • Chrome: 4.
  • Edge: 12.
  • Firefox: 4.
  • Safari: 7.

Source

Lighthouse 稽核失敗的原因

Lighthouse 報告警告,找不到 HTTP 嚴格傳輸安全性回應標頭。

稽核會標記 HSTS 標頭的下列問題:

  • 如果完全找不到 HTTP 嚴格傳輸安全性標頭。
  • 如果缺少其中一項建議指令 (max-ageincludeSubDomainspreload)
  • max-age 指令的期限少於一年 (31536000 秒)。
  • 剖析標頭時發生語法錯誤,例如不明指令。

設定安全強度高的 HTTP 嚴格傳輸安全性政策

最佳的 HTTP 嚴格傳輸安全性標頭設定如下:

Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
  • max-age 指令會指定使用者瀏覽器必須使用 TLS 造訪網站的時間長度 (以秒為單位)。時間一到,如果網站未提供 HSTS 標頭 (或從 HTTP 臨時重新導向至 HTTPS),使用者就能再次透過純 HTTP 連線存取網站。
  • 設定 includeSubDomains 指令後,系統會強制在最初傳送標頭的網頁網址的所有子網域中加入標頭。舉例來說,如果 google.com 傳送的 HSTS 標頭包含 includeSubDomains 指令,系統就會在 mail.google.com 上強制執行 HSTS 標頭。
  • 設定 preload 指令,並將網域提交至 HSTS 預先載入服務,即可將網域編譯至使用預先載入 HSTS 清單的瀏覽器二進位檔。不只 Google Chrome 適用這項原則。

推出 HSTS 標頭時,可能會遇到一些風險。如果任何功能需要未加密的 HTTP 連線,在 max-age 指令設定的時間內,這些功能都會無法正常運作。如果套用 preload 指令,可能需要更長時間。

為降低發布相關風險,建議採取分階段做法:

  1. 先從小型 max-age 開始,然後只新增 includeSubDomains (不新增 preload):

    max-age=3600; includeSubDomains
    
  2. 等待期 (例如一週) 結束後,如果沒有回報任何問題,請提高 max-age。例如:

    max-age=604800; includeSubDomains
    
  3. 如果這個初始階段持續一段時間 (例如三個月) 都運作正常,網站及其子網域就應加入 HSTS 預先載入清單,並新增 preload 指令。

    max-age=63072000; includeSubDomains; preload