天天看點

HTTPS混合内容解析

什麼是HTTPS混合内容

我們可能會有這樣的經驗,當我們通過HTTPS通路一個網站的時候,突然有提示:“本頁面包含有不安全的内容”。這個時候會詢問是否顯示“不安全的内容”,這個時候,就是遇到了有混合内容的頁面了。

HTTPS下的頁面,幾乎很少是采用單一連接配接,HTML辨別、圖檔、JS腳本以及其他頁面資源不僅是多個連接配接擷取到,甚至可能是來自完全不同的伺服器和網站。為了確定一個頁面進行了正确的加密,所有的頁面資源都通過HTTPS進去擷取是必要的。但在實際情況中,全部資源都采用HTTPS卻不常見,這就倒是了混合内容(mixed content)安全問題的産生。

産生混合内容的原因

程式員

某些程式員仍然基于HTTP下的程式設計習慣,導緻代碼的不嚴謹。最常見的就是采用絕對路徑的方式,通路網站上的資源,在HTTP的模式下這種方式可能都是正确的,但一旦這些頁面要求改用HTTPS,這些元素就很可能是被通過HTTP調用,而産生錯誤。

Mashup

随着Mashup的發展,網站不再是自己提供全部内容,它們混合其他網站的内容,而内容的來源則被隐去。Mashup雖然對開發者來說非常有用,但也讓我們的HTTPS變得不可捉摸。

Mashup主要通過在頁面加載第三方的JavaScript代碼來實作的,在HTTPS加密的上下文中,經常會出現第三方的内容和服務不支援HTTPS加密,前幾年,百度和Goolge的很多服務業也都不支援HTTPS,最近2、3年,才開始支援全網SSL,但有些小的服務商依然不能做到全部支援HTTPS。

CDN

CDN在全球建立大量的伺服器,可以通過對使用者通路IP位址的判斷,選擇最優的網絡通路位置,為使用者提供大量的(主要是靜态)資料檔案。通常CDN要支援使用者通過HTTPS通路内容的成本比較高,因為CDN通常使用BDNS的域名解析技術,這會對一個網站在全球的各個不同的分發站點配置設定不同的主機名,是以我們經常必須采用Wildcard通配符證書,甚至Wildcard San證書來支援,同時因為SNI的相容性還不夠完善,每個分發點最好都具體自己獨立的IP位址,這也導緻運維的複雜性和成本的提高。

混合内容的影響

混合内容的影響主要與沒有被加密的内容性質所決定,目前主要有兩種性質的内容:

混合被動内容(Mixed passive content),混合主動内容(Mixed active conttent)。前者也叫混合顯示(Mixed Display),它們是低風險的内容,例如圖檔; 後者也叫作混合腳本(Mixed Scripting),它們是高風險的内容,常見的有JavaScript腳本。

混合主動内容是威脅的真正來源。一個不被加密的JavaScript檔案的引用,可能會被主動攻擊者劫持,并用來擷取對頁面的完全控制,已經使用受害者的身份在網站上執行任意的動作。對于其他危險的資源類型也是如此,包括:HTML(架構)、CSS、FLASH和JAVA應用程式等。

混合被動内容雖然不是那麼的危險,但依然會破壞頁面的完整性。在某些情況下,攻擊者可以通過在圖檔中插入資訊來玩弄受害者,可能導緻釣魚攻擊的發生。

浏覽器的處理

Android浏覽器

Android的浏覽器對混合内容沒有任何限制。

Chrome

Chrome從版本38開始,會阻止所有的混合主動内容。

Firefox

Firefox很久以前就可以對混合内容進行檢測并發出警告,但一直到版本23以後,開始對所有的混合主動内容進行阻斷。

IE

IE從IE5(1999年)開始就支援對混合内容的檢測,當IE檢測到同一個頁面上存在加密和明文内容的時候,它将提示使用者來決定如何處理。但一直到IE9以後,才開始對混合主動内容進行阻斷,同時開始對混合的被動内容采取了默許的方式。

Safri

Safri目前不阻斷任何混合内容,這是它與其他浏覽器相比的一個很大的差別。

 Images   CSS   Scripts XHR   Websockets   Frames
 Android Brower 4.4  Y Y
 Chrome    41 N
 Firefox 30
 IE 11
 Safari

查找混合内容

查找網頁是否存在混合内容,推薦使用Chrome的“開發者工具”:

HTTPS混合内容解析

通路需要測試網頁,然後打開,開發者工具,選擇“Security”-"Non-Secure Origin",就可以看到Mixed Content:

HTTPS混合内容解析

解決辦法

檢查代碼

新的網站開發,在搭建測試環境時,建議直接在測試環境部署HTTPS,以確定網站在測試時就能及時發現混合内容問題,并及時糾正。

程式員在代碼開發時,可以采用以下方式:

  • 本地的圖檔和腳本通過HTTP顯示方式直接調用。可以檢索所有通過http://絕對路徑方式調用的元素,改用本地相對路徑。
  • 通路了一些外網的圖檔和腳本。譬如某網站www.domain.com,将圖檔放在另外一個站點img.domain.com,将腳本通路js.domain.com上,請在每個站點都部署HTTPS,然後将原先的http://的引用方式調整為//的引用方式。例如:原先的代碼 <img src="http://img.domain.com/image/1.jpg" /> 修改為 <img src="//img.domain.com/image/1.jpg" /> 。調整後,浏覽器會自動選擇http還是https來通路外網資源。
  • 如需要使用第三方系統提供的應用服務,請尋求支援HTTPS的服務商,目前百度和Google都已經支援全網HTTPS,而且正規的應用服務上,都會開始支援HTTPS了。

HTST

HTST是一種強制浏覽器擷取安全資源的機制,即使在面對使用者錯誤(譬如使用者用80端口通路到你的網站)以及實作錯誤(網站開發人員在HTTPS頁面上加了不安全的元素)也依然有效。這個特性有效的消除了混合内容的問題,但僅能在你能控制的域名下工作。

HTST要求通過301跳轉的方式,一下僅就IIS簡要介紹一下:

首先在網站上配置1個HTTP的網站,和一個HTTPS的網站,選擇HTTP重定向:

HTTPS混合内容解析

狀态代碼設定為:永久(301)。重定向到相同域名的HTTPS站點上。

HTTPS混合内容解析

有關HTST的詳細使用,我們将另外發文介紹。

CSP

為了阻斷從第三方網站擷取到的不安全資源,可以使用安全内容政策(Content Security Policy,CSP)。這個安全特性可以對不安全的資源進行阻斷。它同時還有很多其他有用的特性來處理應用層安全問題。

FYI: https://www.myssl.cn/home/article-56.html