Defaults.Exposed

Defaults.Exposed修復 › HSTS(嚴格傳輸安全)

如何修復 HSTS(嚴格傳輸安全)

HSTS 是你的網站給每一個瀏覽器下的一行指令:「以後永遠透過安全、加密的連線來找我——絕不要走不安全的那條。」沒有它,你的那把鎖可以在共享 WiFi 上被悄悄剝掉,而對你網站的頭一次訪問就是暴露的。

對您業務的關鍵影響: 有 HTTPS(那把鎖)不等於強制使用它。沒有 HSTS,一個和你客戶在同一 WiFi 上的攻擊者可以悄悄把連線降級到普通、未加密的 HTTP——在客戶察覺不到任何異常的情況下,擷取登入、卡號和表單資料。你那張可能還在花錢的 SSL 憑證就被繞過了。修復免費,運營你網站的人約 15 分鐘即可完成。

這會讓您付出什麼代價

為什麼它重要。 HTTPS 在連線已經加密後保護它——但它不強制瀏覽器使用加密。攻擊者用「SSL 剝離」鑽這個空子:在任何共享網路上,他們悄悄讓訪客停留在不安全的 HTTP 上,讀取一切。HSTS 告訴瀏覽器對你的網域徹底拒絕普通 HTTP、並持續很長時間,於是這個缺口在第一次訪問後就關上了。它是一個回應標頭,免費即可新增,而在我們的評分裡它值實打實的分數,因為一個缺失或太短的值會讓每一個公共 WiFi 上的訪客暴露。

這是什麼,大白話版

你幾乎肯定有 HTTPS——瀏覽器列裡那把小鎖。很好。但這裡有幾乎沒人被告知的部分:有 HTTPS 不等於強制 HTTPS。

HTTPS 讓連線在瀏覽器決定使用它之後變得加密。HSTS——是 **HTTP Strict Transport Security(HTTP 嚴格傳輸安全)**的縮寫——是那句讓瀏覽器始終使用它的指令。它是你網站發給每個訪客的一行看不見的文字,實質上說:

「從現在起,對我的網域,只透過安全連線和我對話。絕不走不安全的。連試都別試。」

瀏覽器會記住它、並按你告訴它的時長服從——通常是一年。在訪客第一次安全訪問之後,他的瀏覽器就乾脆拒絕透過普通、未加密的 HTTP 載入你的網站,哪怕有什麼東西試圖強制它。

沒有 HSTS,那條「始終使用安全版本」的規則就不存在——而攻擊者恰恰知道如何利用這個缺口。

這會讓你付出什麼代價

下面是現實、日常的情景。我們從不點名任何真實企業;這些是這個缺口如何被利用的例證。

  1. 咖啡廳裡的結帳。 一個客戶在咖啡廳 WiFi 上打開你的店鋪去結帳。同一網路上的攻擊者跑一個免費、廣為人知的工具,讓客戶停留在普通 HTTP 而非 HTTPS 上。客戶看到的是一個看起來正常的網站——沒有警告,瞥一眼的那個位置也沒有破損的鎖——於是輸入了卡號。攻擊者讀到每一次按鍵。你的 SSL 憑證什麼都沒做,因為連線從一開始就沒被允許變安全。
  2. 出差的員工。 一名員工從飯店或機場登入你的後台或網頁信箱。同樣的降級把戲擷取了他的使用者名稱和密碼。現在攻擊者有了進你公司的路——不是因為你的密碼策略弱,而是因為登入頁面可透過不安全的 HTTP 抵達。
  3. 擱淺的生意。 一個大客戶在簽約前給你發來他們的標準安全問卷。其中一行問:「你的網站是否透過 HSTS 強制 HTTPS?」你的 IT 聯絡人不得不答「否」,於是採購流程暫停,而你手忙腳亂地去修一個免費的、15 分鐘的設定——它現在在一個買家面前看起來像一面紅旗。
  4. 網路保險或合規檢查。 一家保險公司的掃描,或一位審查你資料保護態勢的稽核師,標記出這個缺失的標頭。個人資料的加密在資料保護規則下是一項明確的期望(GDPR 第 32 條),而「我們有憑證但不強制它」是個站不住腳的位置。
  5. 虛假的安全感。 你為 SSL 付著錢,鎖顯示著,所有人都以為網站安全。它大體上是安全的——直到一個客戶處在共享網路上,而那恰恰是他最脆弱、又最不可能察覺異常的時候。

貫穿的主線:代價不抽象。它是一個真實客戶的卡或登入,在最糟糕的時刻被擷取,而且沒有任何警報響起。

它到底是什麼

當瀏覽器向你的網站請求一個頁面時,你的伺服器送回頁面外加一些看不見的「標頭」——瀏覽器讀取、訪客卻從不會看到的額外指令。HSTS 就是其中之一:

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

三個部分要緊:

為什麼「第一次訪問」要緊

HSTS 有一個固有局限:瀏覽器只在至少見過這個標頭一次之後才服從規則。所以一個全新訪客的第一次連線仍是一個微小的暴露窗口。兩樣東西收窄它:一個 HTTP 到 HTTPS 的跳轉(迅速把他們送上安全版本)和 preload(徹底移除這個窗口)。這正是為什麼一個完整的設定會把 HSTS 與一個正經的跳轉配對。

「好」長什麼樣——以及它如何評分

我們的檢查讀取你的即時標頭,並給 max-age 評分:

max-age 值它意味著什麼結果
一年或以上(≥ 31536000)優秀——推薦的設定滿分
六個月或以上(≥ 15768000)不錯,但不到整年部分分
一天或以上(≥ 86400)弱——太短不可靠低 / 部分分
不足一天,或根本沒有標頭實質上沒有保護失敗(高嚴重度)

所以一個存在卻被設成幾分鐘的標頭,被當作失敗——它看起來設好了,實際沒在幹活。瞄準一年。檢查還會注明 includeSubDomainspreload 是否存在。

如何修復(免費,約 15 分鐘)

把這一節交給運營你網站的人——你的 IT 人員、網頁開發者或主機商支援。修復免費。 它是一個標頭,或你主機平台裡的一個開關。沒什麼要買的。

先來一條重要的順序規則: HSTS 是黏的——一旦啟用,瀏覽器會在整個 max-age 期間拒絕對你網域走普通 HTTP。所以在廣泛打開它之前,確認 HTTPS 在你的主站以及每一個子網域上都正確運作。穩妥的路徑是:用一個短值測試 → 確認沒有東西壞掉 → 升到一年。

第 1 步——先確保 HTTPS 已經到處都能用

透過 https:// 訪問你的網站和關鍵子網域,確認它們帶著一張有效憑證乾淨地載入。也確認普通 http:// 請求會跳轉到 https://。(如果不跳,先修好 HTTP 到 HTTPS 的跳轉——HSTS 假定它已就位。)

第 2 步——新增這個標頭(選你的平台)

Cloudflare(或類似 CDN): 這最簡單。前往 SSL/TLS → Edge Certificates → HTTP Strict Transport Security (HSTS) 並啟用它。把 Max-Age 設為 6 個月或 12 個月,並在你確定所有子網域都在 HTTPS 上之後,啟用「Apply HSTS policy to subdomains」。

Nginx: 在你的 HTTPS server 區塊裡加:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

Apache: 確保 mod_headers 已啟用,然後加到你的 HTTPS 虛擬主機:

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

Microsoft IIS: 加到 web.config<customHeaders> 內:

<add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains; preload" />

Google Workspace / Microsoft 365 說明: 這些驅動的是你的郵件,不是你的網站託管——HSTS 設在你公開網站實際所在的地方(你的 CDN、Web 伺服器或建站工具),而不是 Workspace/365 管理後台。如果你的網站在 Squarespace、Wix 或 Shopify 這樣的建站工具上,HSTS 通常已替你處理好;如果我們的檢查標記了它,去看它們的 SSL/安全設定。

第 3 步——小步測試,再正式提交

max-age=300(5 分鐘)起步。確認網站到處仍完美載入。然後把它升到 max-age=31536000(一年)。那是滿分的設定。

第 4 步(可選,黃金標準)——preload

等你有把握、且已經跑了一段時間帶 includeSubDomains 的一年標頭之後,你可以在 hstspreload.org 提交你的網域,把它烤進瀏覽器。這徹底關上第一次訪問的窗口。把它當作一個深思熟慮的承諾——從清單裡移除一個網域很慢。

常見錯誤

常見問題

我們已經有 HTTPS、那把鎖也顯示了。這還不夠嗎?

不夠——而且這是迄今最常見的誤解。那把鎖意味著連線「能」被加密;它不強制瀏覽器使用加密版本。沒有 HSTS,同一網路上的攻擊者能讓訪客停留在普通 HTTP(叫做 SSL 剝離),讀取他輸入的一切,而客戶看到的是一個看起來正常的網站。HSTS 是那句讓「僅限加密」成為強制的指令。沒有 HSTS 的 HTTPS,是一扇上了鎖卻沒真正插上的門。

打開它貴不貴、有沒有風險?

修復本身免費——它是你 Web 伺服器裡的一行、或你 CDN 裡的一個開關——約 15 分鐘。唯一要真正當心的:HSTS 是「黏」的。瀏覽器一旦見到它,就會按你指定的時長拒絕對你網域走普通 HTTP。所以在廣泛啟用前,你必須確信 HTTPS 在你的主站「以及」每一個子網域上都能用。先用一個短的測試值起步,確認沒有東西壞掉,再把它升到一年。按這個順序來,風險微乎其微。

「好」到底長什麼樣?

max-age 至少一年(31536000 秒)。我們的檢查在一年或以上給滿分,半年給部分分,一天給弱/部分分,並把任何不足一天的當作實質上不存在。最強的設定還會加上 includeSubDomains(覆蓋 shop.yoursite.com、app.yoursite.com 等)和 preload(把保護烤進瀏覽器,讓哪怕頭一次訪問也安全)。

什麼是「preload」,我們需要它嗎?

HSTS 只在瀏覽器至少見過這個標頭一次「之後」才保護訪客——所以一個全新訪客的第一個請求仍是一個小窗口。內建於 Chrome、Firefox、Safari 和 Edge 的 HSTS preload 清單,透過提前把你的網域裝進瀏覽器來關上那個窗口。它是可選的、且是一個略大的承諾(移除很慢),但它是黃金標準。對多數小企業,一個帶 includeSubDomains 的一年 max-age 已是一個強壯、穩妥的結果;preload 是你安頓下來後的額外一步。

我們用 Squarespace / Wix / Shopify——我們到底需不需要做什麼?

多數全託管的建站工具(Squarespace、Wix、Shopify 等)強制 HTTPS,並常常自動為你設好 HSTS——所以你可能已經通過、無需做任何事。例外是當你在網站前面用了自訂網域或 CDN 時;那時這個設定可能從縫隙裡漏掉。跑一下檢查:通過就完事;標記了,修復就是你平台 SSL/安全設定裡的那個開關,或你 CDN 裡的一行。

如果我們不修,會拉低我們的評分嗎?

會。HSTS 是一項計分的網站安全檢查,不是參考性的——一個缺失或太短的標頭會扣分、且被評為高嚴重度,因為它直接在共享網路上暴露你訪客的資料。它也是最便宜就能找回的分數之一:一個免費的標頭,約 15 分鐘的活。