混合內容
當使用者以 HTTPS 瀏覽網站時,他們與伺服器之間的連線就會以 TLS 加密,以防受到竊聽或中間人攻擊。一個含有 HTTP 明文內容的 HTTPS 頁面稱為混合內容(mixed content)。這種頁面只有部份加密,沒有加密的內容,易於遭到竊聽和中間人攻擊。這會令網頁不安全。
混合內容的類型
混合內容的類型有兩種:被動/顯示型混合內容(mixed passive/display content)與主動型混合內容(mixed active content)。兩者不同處在於內容遭中間人攻擊竄改後,其最壞情況下的威脅程度。如果是被動型混合內容,威脅程度較低(可能有錯誤內容、或者用戶的 cookie 遭到竊取)。如果是主動型混合內容,威脅就可能會變成網絡釣魚、敏感資料洩露、被重定向到惡意網站……等等。
被動/顯示型混合內容
主動型混合內容
主動型混合內容是指有權訪問文件 HTTPS 頁面、物件模型的內容。這種混合內容可以改變 HTTPS 頁面行為、並暗自竊取用戶的敏感資訊。因此,主動型混合內容除了內容除了上文所述的風險外,還容易受到其他攻擊媒介的威脅。
針對主動型混合內容,中間人攻擊者可以攔截 HTTP 內容的請求、並竄改回應以植入惡意 JavaScript 程式碼。惡意的主動型混合內容能竊取用戶的憑證、用戶的敏感資料、甚至透過如瀏覽器或套件的漏洞,嘗試安裝惡意軟體。
混合內容涉及的風險,取決於用戶訪問的網站類型、還有該網站資訊的敏感程度。網頁可能有公諸於世的公開資料、也可能有僅限授權者閱覽的私人資料。即使網頁是公開的,也沒有用戶的敏感資料,混合內容依舊給攻擊者把用戶重定向到其他 HTTP 頁面、並從這些網站竊取 HTTP cookie 的機會。
主動型混合內容示例
以下列出會被視為主動型混合內容的 HTTP 請求:
<script>
(src
屬性)<link>
(href
屬性)(包含 CSS 樣式表)<iframe>
(src
屬性)XMLHttpRequest
請求fetch()
請求- 所有用到
url
的 CSS 值(@font-face
、cursor
、background-image
……等等)。 <object>
(data
屬性)
其他資源如 web fonts 與 workers 也可能被認定為主動型混合內容,因為在 Chromium 就是這樣。
網頁主控台的警告
Firefox 網頁主控台會在網站含有混合內容時,於「網路」標籤顯示警告。以 HTTP 傳輸的混合內容資源會被標為紅色,後面會附上導往這一頁的「混合內容」標註。
找到網頁主控台的警告後,可以在你的網站使用 Content Security Policy (CSP) 或網站爬蟲找到問題,,例如 HTTPS Checker 或是 Mixed Content Scan。
從 Firefox 23 以後,預設會封鎖混合內容(要封鎖混合的顯示內容也可以設定)。為了令 web 開發者便於尋找混合內容的錯誤,所有遭到封鎖的混合內容會被紀錄到網頁主控台的安全標籤,如下所示:
要修正這個錯誤,就要移除所有的 HTTP 請求、並以 HTTPS 取代之。部份例子包含 JavaScript 檔案、CSS 樣式表、影像檔、影片檔或是其他多媒體文件。
备注: Firefox 55 以後,在本機端會允許混合內容的載入(請參見 Firefox bug 903966)。