嚴格傳輸安全
HTTP 的 **Strict-Transport-Security** 響應頭(通常縮寫為 HSTS)通知瀏覽器網站只能透過 HTTPS 訪問,並且任何將來嘗試使用 HTTP 訪問它的操作都應自動轉換為 HTTPS。
注意:這比在伺服器上簡單地配置 HTTP 到 HTTPS(301)重定向更安全,因為在 HTTP 到 HTTPS 重定向中,初始的 HTTP 連線仍然容易受到中間人攻擊。
語法
Strict-Transport-Security: max-age=<expire-time>
Strict-Transport-Security: max-age=<expire-time>; includeSubDomains
Strict-Transport-Security: max-age=<expire-time>; includeSubDomains; preload
指令
max-age=<過期時間>-
瀏覽器應記住某個站點只能使用 HTTPS 訪問的時間(以秒為單位)。
includeSubDomains可選-
如果指定了此可選引數,則此規則也適用於該站點的所有子域。
preload可選 非標準-
有關詳細資訊,請參閱 預載入嚴格傳輸安全。使用
preload時,max-age指令必須至少為31536000(1 年),並且必須存在includeSubDomains指令。不是規範的一部分。
描述
如果網站透過 HTTP 接受連線並重定向到 HTTPS,則訪問者可能最初會與網站的未加密版本通訊,然後再被重定向,例如,如果訪問者鍵入 http://www.foo.com/ 甚至只是 foo.com。這為中間人攻擊創造了機會。可以利用重定向將訪問者重定向到惡意網站,而不是原始網站的安全版本。
HTTP 嚴格傳輸安全標頭通知瀏覽器永遠不要使用 HTTP 載入站點,並且應自動將所有嘗試使用 HTTP 訪問站點的操作轉換為 HTTPS 請求。
注意:當您的站點僅透過 HTTP 訪問時,瀏覽器會忽略 Strict-Transport-Security 標頭。一旦您的站點透過 HTTPS 訪問且沒有證書錯誤,瀏覽器就會知道您的站點支援 HTTPS,並將遵守 Strict-Transport-Security 標頭。瀏覽器這樣做是因為攻擊者可能會攔截到站點的 HTTP 連線並注入或刪除標頭。
一個示例場景
您登入機場的免費 Wi-Fi 熱點並開始上網,訪問您的網上銀行服務以檢查餘額並支付幾張賬單。不幸的是,您使用的接入點實際上是駭客的筆記型電腦,他們正在攔截您的原始 HTTP 請求並將您重定向到銀行網站的克隆版本,而不是真正的網站。現在您的私人資料暴露給了駭客。
嚴格傳輸安全解決了此問題;只要您曾經使用 HTTPS 訪問過銀行的網站,並且銀行的網站使用了嚴格傳輸安全,您的瀏覽器就會知道自動僅使用 HTTPS,從而防止駭客執行這種中間人攻擊。
瀏覽器如何處理它
第一次使用 HTTPS 訪問您的站點並且它返回 Strict-Transport-Security 標頭時,瀏覽器會記錄此資訊,以便將來嘗試使用 HTTP 載入該站點時將自動使用 HTTPS。
當 Strict-Transport-Security 標頭指定的時間到期時,下次嘗試透過 HTTP 載入該站點將照常進行,而不是自動使用 HTTPS。
每當將 Strict-Transport-Security 標頭傳遞給瀏覽器時,它都會更新該站點的過期時間,因此站點可以重新整理此資訊並防止超時到期。如果需要停用嚴格傳輸安全,則將 max-age 設定為 0(透過 https 連線)將立即使 Strict-Transport-Security 標頭過期,從而允許透過 http 訪問。
預載入嚴格傳輸安全
Google 維護著 一個 HSTS 預載入服務。透過遵循指南併成功提交您的域名,您可以確保瀏覽器僅透過安全連線連線到您的域名。雖然該服務由 Google 託管,但所有瀏覽器都使用此預載入列表。但是,它不是 HSTS 規範的一部分,不應視為官方的。
- 有關 Chrome 中 HSTS 預載入列表的資訊: https://www.chromium.org/hsts/
- 查詢 Firefox HSTS 預載入列表: nsSTSPreloadList.inc
示例
所有當前和將來的子域名將在 1 年的 max-age 內使用 HTTPS。這阻止了訪問只能透過 HTTP 提供的頁面或子域名。
Strict-Transport-Security: max-age=31536000; includeSubDomains
儘管對於域名來說,1 年的 max-age 是可以接受的,但建議的值是兩年,如 https://hstspreload.org 中所述。
在以下示例中,max-age 設定為 2 年,並在後面添加了 preload,這對於包含在所有主要 Web 瀏覽器的 HSTS 預載入列表(如 Chromium、Edge 和 Firefox)中是必需的。
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
規範
| 規範 |
|---|
| HTTP 嚴格傳輸安全 (HSTS) # 第 6.1 節 |
瀏覽器相容性
BCD 表格僅在啟用 JavaScript 的瀏覽器中載入。
另請參閱
- 博文: HTTP 嚴格傳輸安全已上線!
- 博文: HTTP 嚴格傳輸安全(強制 HTTPS)
- OWASP 文章: HTTP 嚴格傳輸安全
- 維基百科: HTTP 嚴格傳輸安全
- HSTS 預載入服務
- 限制在安全上下文中使用的功能