使用嚴格的 HSTS 政策

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

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

Lighthouse 稽核失敗的原因

Lighthouse 稽核警告指出未發現 HSTS 回應標頭。
Lighthouse 報告警告指出未發現 HSTS 回應標頭。

稽核作業會標示 HSTS 標頭的下列問題:

  • 如果完全找不到 HSTS 標頭。
  • 如果缺少其中一個建議指示 (max-ageincludedSubDomainspreload)
  • 如果 max-age 指令的時間長度低於一年 (31536000 秒)。
  • 如果剖析標頭時發生語法錯誤,例如不明指令。

設定嚴格的 HSTS 政策

最佳的 HSTS 標頭設定如下所示:

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