HTTPS安全最佳實踐
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年。
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年。
相關文章
- Dockerfile 安全最佳實踐Docker
- MongoDB最佳安全實踐MongoDB
- Kubernetes 最佳安全實踐指南
- 7個API安全最佳實踐API
- 實現容器安全管理的最佳實踐
- 如何讓HTTPS站點評級達到A+? 還得看這篇HTTPS安全優化配置最佳實踐指南HTTP優化
- Spring Boot 安全性最佳實踐Spring Boot
- SpringBoot微服務安全最佳實踐 - piotrminkowskiSpring Boot微服務
- SQL Server安全設定最佳實踐SQSQLServer
- 資料庫安全最佳實踐:基本指南資料庫
- Kubernetes(k8s)部署安全最佳實踐K8S
- 雲端儲存安全標準和最佳實踐
- JavaScript 最佳實踐JavaScript
- JDBC 最佳實踐JDBC
- Kafka最佳實踐Kafka
- Java最佳實踐Java
- Serilog 最佳實踐
- Flutter 最佳實踐Flutter
- springDataJpa 最佳實踐Spring
- Gradle最佳實踐Gradle
- MongoDB 最佳實踐MongoDB
- Iptables 最佳實踐 !
- AutoMapper 最佳實踐APP
- 《.NET最佳實踐》
- Django 最佳實踐Django
- metaq最佳實踐
- KeyPath 最佳實踐
- Pika最佳實踐
- SnapKit 最佳實踐APK
- 應用部署初探:6個保障安全的最佳實踐
- 確保 Kubernetes 安全合規的 6 個最佳實踐
- 乾貨 | 京東雲賬號安全管理最佳實踐
- Code Review最佳實踐View
- 日誌最佳實踐
- Kubernetes Deployment 最佳實踐
- restful api最佳實踐RESTAPI
- 冪等最佳實踐
- RocketMQ的最佳實踐MQ