跳到內容 跳到搜尋

Action Dispatch SSL

config.force_ssl = true 時,此中間件會被加入到串列中,並傳遞在 config.ssl_options 中設定的選項。它執行三個工作來強化 HTTP 要求的安全性

  1. TLS 轉址:將 http:// 要求永久轉址到有著相同 URL 主機、路徑等的 https://。預設啟用。設定 config.ssl_options 來修改目的地 URL

    config.ssl_options = { redirect: { host: "secure.widgets.com", port: 8080 }`
    

    或設定 redirect: false 來停用轉址。

    要求可以使用 exclude 來選擇不轉址

    config.ssl_options = { redirect: { exclude: -> request { request.path == "/up" } } }
    

    Cookies 對於被排出的要求不會被標記為安全。

    當透過終止 SSL 的負載平衡器進行代理時,轉發的請求對於應用程式來說看起來會像是 HTTP 而不是 HTTPS。這會使轉址和 Cookie 安全性鎖定 HTTP 而不是 HTTPS。若要讓伺服器假設代理已經終止 SSL,而且要求實際上是 HTTPS,請將 config.assume_ssl 設定為 true

    config.assume_ssl = true
    
  2. 安全 Cookie:設定 Cookie 的 secure 標記來告訴瀏覽器它們不得與 http:// 請求一起傳送。預設啟用。使用 secure_cookies: false 設定 config.ssl_options 來停用此功能。

  3. HTTP 嚴格傳輸安全 (HSTS):告訴瀏覽器將此網站記為僅 TLS,並自動轉址非 TLS 要求。預設啟用。使用 hsts: false 設定 config.ssl_options 來停用。

    使用 hsts: { ... } 設定 config.ssl_options 來設定 HSTS

    • expires:這些設定將持續多久,單位為秒。資格符合瀏覽器預載清單的最小時間要求為 1 年。預設為 2 年 (建議)。

    • subdomains:設定為 true 來告訴瀏覽器對所有子網域套用這些設定。這可以保護你的 Cookie 不會被子網域上一個有漏洞的網站攔截。預設為 true

    • preload:宣傳這個網站可以包含在瀏覽器的預載 HSTS 清單中。HSTS 會在每次造訪時保護你的網站,但第一次造訪除外,因為它尚未看到你的 HSTS 標頭。為了彌補這個漏洞,瀏覽器供應商會包含一個已內建 HSTS 啟用網站的清單。前往 hstspreload.org 來提交申請將你的網站包含在內。預設為 false

    若要關閉 HSTS,僅省去標頭是不夠的。瀏覽器會記住原始的 HSTS 指令,直到它過期。改為使用標頭來告訴瀏覽器立即讓 HSTS 過期。設定 hsts: false 等於設定 hsts: { expires: 0 }