咱們可能會有這樣的經驗,當咱們經過HTTPS訪問一個網站的時候,忽然有提示:「本頁面包含有不安全的內容」。這個時候會詢問是否顯示「不安全的內容」,這個時候,就是遇到了有混合內容的頁面了。
HTTPS下的頁面,幾乎不多是採用單一鏈接,HTML標識、圖片、JS腳本以及其餘頁面資源不只是多個鏈接獲取到,甚至多是來自徹底不一樣的服務器和網站。爲了確保一個頁面進行了正確的加密,全部的頁面資源都經過HTTPS進去獲取是必要的。但在實際狀況中,所有資源都採用HTTPS卻不常見,這就卻是了混合內容(mixed content)安全問題的產生。html
某些程序員仍然基於HTTP下的編程習慣,致使代碼的不嚴謹。最多見的就是採用絕對路徑的方式,訪問網站上的資源,在HTTP的模式下這種方式可能都是正確的,但一旦這些頁面要求改用HTTPS,這些元素就極可能是被經過HTTP調用,而產生錯誤。程序員
隨着Mashup的發展,網站再也不是本身提供所有內容,它們混合其餘網站的內容,而內容的來源則被隱去。Mashup雖然對開發者來講很是有用,但也讓咱們的HTTPS變得不可捉摸。編程
Mashup主要經過在頁面加載第三方的JavaScript代碼來實現的,在HTTPS加密的上下文中,常常會出現第三方的內容和服務不支持HTTPS加密,前幾年,百度和Goolge的不少服務業也都不支持HTTPS,最近二、3年,纔開始支持全網SSL,但有些小的服務商依然不能作到所有支持HTTPS。瀏覽器
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的瀏覽器對混合內容沒有任何限制。網絡
Chrome從版本38開始,會阻止全部的混合主動內容。併發
Firefox好久之前就能夠對混合內容進行檢測併發出警告,但一直到版本23之後,開始對全部的混合主動內容進行阻斷。框架
IE從IE5(1999年)開始就支持對混合內容的檢測,當IE檢測到同一個頁面上存在加密和明文內容的時候,它將提示用戶來決定如何處理。但一直到IE9之後,纔開始對混合主動內容進行阻斷,同時開始對混合的被動內容採起了默許的方式。運維
Safri目前不阻斷任何混合內容,這是它與其餘瀏覽器相比的一個很大的區別。
Images | CSS | Scripts | XHR | Websockets | Frames | |
Android Brower 4.4 | Y | Y | Y | Y | Y | Y |
Chrome 41 | Y | N | N | N | N | N |
Firefox 30 | Y | N | N | N | N | N |
IE 11 | Y | N | N | N | N | N |
Safari | Y | Y | Y | Y | Y | Y |
查找網頁是否存在混合內容,推薦使用Chrome的「開發者工具」:
訪問須要測試網頁,而後打開,開發者工具,選擇「Security」-"Non-Secure Origin",就能夠看到Mixed Content:
新的網站開發,在搭建測試環境時,建議直接在測試環境部署HTTPS,以確保網站在測試時就能及時發現混合內容問題,並及時糾正。
程序員在代碼開發時,能夠採用如下方式:
HTST是一種強制瀏覽器獲取安全資源的機制,即便在面對用戶錯誤(譬如用戶用80端口訪問到你的網站)以及實現錯誤(網站開發人員在HTTPS頁面上加了不安全的元素)也依然有效。這個特性有效的消除了混合內容的問題,但僅能在你能控制的域名下工做。
HTST要求經過301跳轉的方式,一下僅就IIS簡要介紹一下:
首先在網站上配置1個HTTP的網站,和一個HTTPS的網站,選擇HTTP重定向:
狀態代碼設置爲:永久(301)。重定向到相同域名的HTTPS站點上。
有關HTST的詳細使用,咱們將另外發文介紹。
爲了阻斷從第三方網站獲取到的不安全資源,可使用安全內容策略(Content Security Policy,CSP)。這個安全特性能夠對不安全的資源進行阻斷。它同時還有不少其餘有用的特性來處理應用層安全問題。
FYI: https://www.myssl.cn/home/article-56.html