Strict-Transport-Security

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

HTTP Strict-Transport-Security 回應標頭(通常縮寫為 HSTS)告知瀏覽器該站點應僅使用 HTTPS 訪問,並且所有將來的 HTTP 訪問應自動轉換為 HTTPS。

备注: 這比簡單地在伺服器上配置 HTTP 到 HTTPS 的重定向(301)更安全,因為初始的 HTTP 連接仍然易受中間人攻擊。

標頭類型 回應標頭
禁止修改的標頭

語法

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=<expire-time>

瀏覽器應記住該站點僅能使用 HTTPS 訪問的時間,以秒為單位。

includeSubDomains 選擇性

如果指定了這個可選參數,該規則也適用於所有子域。

preload 選擇性 Non-standard

請參見預加載嚴格傳輸安全性的詳細訊息。當使用 preload 時,max-age 指令必須至少為 31536000(1 年),並且必須包含 includeSubDomains 指令。這不是規範的一部分。

描述

如果網站接受通過 HTTP 的連接並重定向到 HTTPS,訪問者可能會在被重定向之前先與未加密版本的網站進行通信,例如,如果訪問者輸入 http://www.foo.com/ 或僅輸入 foo.com。這給中間人攻擊創造了機會。重定向可能會被利用,將訪問者引導到惡意網站,而不是原站點的安全版本。

HTTP Strict Transport Security 標頭告知瀏覽器不應使用 HTTP 加載站點,應自動將所有嘗試使用 HTTP 訪問站點的請求轉換為 HTTPS。

备注: 當你的站點僅通過 HTTP 訪問時,瀏覽器會忽略 Strict-Transport-Security 標頭。一旦你的站點通過 HTTPS 訪問且沒有憑證錯誤,瀏覽器會知道你的站點支持 HTTPS,並會尊重 Strict-Transport-Security 標頭。瀏覽器這樣做是因為攻擊者可能會攔截到站點的 HTTP 連接並注入或刪除標頭。

範例場景

你在機場登錄到免費 Wi-Fi 接入點並開始上網,訪問你的在線銀行服務以查看餘額和支付一些帳單。不幸的是,你使用的接入點實際上是駭客的筆記本電腦,他們攔截了你的原始 HTTP 請求並將你重定向到一個仿冒的銀行網站,而不是實際的網站。現在,你的私人數據暴露在駭客面前。

嚴格傳輸安全性解決了這個問題;只要你曾經使用 HTTPS 訪問過你的銀行網站,並且銀行網站使用嚴格傳輸安全性,你的瀏覽器就會知道自動僅使用 HTTPS,這可以防止駭客執行此類中間人攻擊。

瀏覽器處理方式

第一次使用 HTTPS 訪問你的站點並返回 Strict-Transport-Security 標頭時,瀏覽器會記錄此訊息,以便將來嘗試加載該站點時自動使用 HTTPS。

Strict-Transport-Security 標頭指定的到期時間過期後,再次嘗試通過 HTTP 加載站點將按正常方式進行,而不是自動使用 HTTPS。

每當瀏覽器接收到 Strict-Transport-Security 標頭時,它會更新該站點的到期時間,以便站點可以刷新此訊息並防止超時過期。如果需要禁用嚴格傳輸安全性,將 max-age 設置為 0(通過 https 連接)會立即使 Strict-Transport-Security 標頭過期,允許通過 http 訪問。

預加載嚴格傳輸安全性

Google 維護一個 HSTS 預加載服務。通過遵循指南並成功提交你的域,你可以確保瀏覽器僅通過安全連接訪問你的域。儘管服務由 Google 託管,但所有瀏覽器都在使用這個預加載列表。然而,它不是 HSTS 規範的一部分,不應被視為官方的。

範例

所有當前和未來的子域在 max-age 為 1 年的時間內都將使用 HTTPS。 這會阻止僅能通過 HTTP 提供的頁面或子域的訪問。

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

儘管對於域來說,1 年的 max-age 是可以接受的,但建議值是 2 年,如 https://hstspreload.org 所解釋。

在下面的範例中,max-age 設置為 2 年,並加上 preload,這是包含在所有主要網頁瀏覽器的 HSTS 預加載列表(如 Chromium、Edge 和 Firefox)中的必要條件。

http
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload

規範

Specification
HTTP Strict Transport Security (HSTS)
# section-6.1

瀏覽器相容性

BCD tables only load in the browser

參見