HTTPS安全最佳實踐

banq發表於2018-08-28
HTTPS對於保護你的網站至關重要。但是你還需要避免許多陷阱

1. 沒有混合內容
混合內容是指在你的HTTPS站點中不能透過HTTP載入資源了。瀏覽器會清晰顯示你的網站是否容易混合內容,在瀏覽器網址一欄有圖示。

如果曾經將http://網址硬編碼到你網站,之後你又將網站遷移到HTTPS時就會出現這種情況。

首先使用https://URL,或者只是將該方案保留並使用//,這指示瀏覽器使用與頁面相同的方案,即http://HTTP和https://HTTPS。

2. 檢查HTTPS配置
HTTPS是沒有二進位制狀態,因此僅將其啟用還是不夠的,有許多配置選項會影響加密本身的各個方面。

幸運的是,有些網站會測試你的配置並提供如何解決某些問題的建議。其中之一是來自Qualys的SSL伺服器測試,它執行一組強大的檢查。

請務必不時檢視你的HTTPS配置,因為可能會出現新的漏洞和最佳做法。

3. 檢查HTTP標頭
有幾個HTTP標頭header可以控制具有安全隱患的方面,雖然並非所有這些標頭都與HTTPS相關。

這個網站能幫助檢查安全頭,它提供了一些很重要標頭的說明。

4. 獲得有關新證書​​的通知
新增最近頒發證書的過程就是所謂的證書透明度,這意味著無論何時為你的域名釋出證書時,都必須將其提交給公共日誌,實際上,你可以檢視你域的所有證書。

甚至可以在釋出新證書時訂閱通知並收到電子郵件,同樣,有幾個這樣的服務可用,例如,有一個來自Facebook

5. 如何處理HTTP
一個常見的誤解是,如果除了重定向到HTTPS之外就可以不使用HTTP了,但是,如果攻擊者攔截了初始HTTP請求並且可以修改它,他可以提供郵件內容而不是重定向,因此,第一個請求仍然很脆弱。

有標頭header可以緩解這個問題,我們也會介紹它們,但首先,讓我們關注不使用它們的情況。

如果攻擊者可以修改請求,那麼你幾乎沒有辦法(除了HSTS),但通常情況下,他更有可能 閱讀但不能修改它,為了防止攻擊者在收聽流量時發生攻擊,有一些最佳做法。

(1)僅傳送重定向
當你重定向到HTTPS時,請不要隨重定向一起傳送任何內容,你傳送的任何文字都以純文字形式傳送,因此最好將其最小化,將內容加入重定向的請求資料中並不好。

(2)使用安全的cookie
任何未標記為安全的 cookie 都可以透過HTTP和HTTPS傳送,反過來,攻擊者可以使用它來模仿HTTPS站點上的使用者。

確保使用安全的cookie。

6. 你應該使用HTTP嗎?
是的,大多數時候。預設情況下,瀏覽器首先請求HTTP站點,因此你需要支援它。

但有一個例外,如果你有一個API端點,那麼你可以(並且應該)完全禁用HTTP,為什麼?瀏覽器遵循重定向,但API客戶端可能不會,或者可能將POST重定向為GET。你不希望某些客戶端工作,而某些客戶端則不工作。

此外,對於API的客戶,你提供方案是讓任何消費者只可以使用HTTPS。

7. HSTS
好吧,看完上面內容後,你發現了一幅令人擔憂的畫面,無論你做什麼,第一個請求都將是脆弱的,幸運的是,HSTS標頭(HTTP Strict Transport Security)目標是解決這個問題。

它的工作原理是指示瀏覽器不應在後續請求中使用HTTP,而只應使用HTTPS。

這是使用HTTPS響應上的響應標頭完成的:

Strict-Transport-Security: max-age=604800;
實際上,即使返回訪問者嘗試透過HTTP載入網站,也會受到保護。

max-age說明
此部分控制標頭有效的時間,在此之後,瀏覽器將忘記標題並再次請求HTTP站點,每次使用者訪問頁面時都會更新。

604800是一週,如果你使用此功能,常規訪問者將受到持續保護。

2592000是一個月

31536000是一年,你不應該使用更多。這已經足夠長了,例如,Chrome將 它限制為一年,所以再也沒有必要設定它了。

includeSubDomains
如果你指定它,子域也將受到保護,例如,如果你傳送標頭example.com:

Strict-Transport-Security: max-age=604800; includeSubDomains

然後,它對這幾個域名都是有效的:example.com,www.example.com,secure.example.com,www.secure.example.com和所有其他子域。

你應該使用這個子域名選項嗎?
這得看情況。這似乎是一件好事,但可能會導致問題。

例如,http://sub.example.com可能適用於某些使用者但不適用於其他使用者,具體取決於他們之前是否訪問過example.com,獲得HSTS標頭的使用者將僅請求HTTPS站點,而其他使用者會一直訪問HTTP站點,如果此子域又不支援HTTPS,則會產生影響。也就是說,以後所有訪問取決於第一次訪問的是http還是https,如果第一次是https,以後都是https,如果第一次是http,以後一直是http。

請注意,如果你為域名設定這個選項,又無法為所有子域設定支援HTTPS,唯一的辦法是等待所有使用者瀏覽器的標頭過期,但這可能需要很長時間。

preload
HSTS的問題在於它只保護回訪者,但第一個請求仍然容易受到攻擊。

現在瀏覽器可以不先訪問它們的情況下知道HSTS標頭的域名列表,Google維護了這樣的預載入列表,該列表包含在Chrome和其他瀏覽器中。

這個內建的預載入列表解決了第一個請求的問題。

要獲取列表,你需要傳送HSTS標頭:

1.在根域,比如jdon.com 而不是www.jdon.com
2.最大年齡至少為一年
3.使用includeSubDomains
4.使用preload預載入

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

這解決了一個特別棘手的問題,但你需要謹慎行事,從預載入列表中刪除是非常重要的,你仍然需要等待標頭過期日期是1年。


HTTPS security best practices - Advanced Web Machi

相關文章