瀏覽器快取 (Cache) 是一種提升網站載入速度的常見技術,但若設定不當,它也可能成為洩漏使用者敏感資訊的途徑,這就是所謂的「URL 快取漏洞」。
什麼是 URL 快取漏洞?
URL 快取漏洞(或稱快取洩漏, Cache Leak)發生在應用程式允許瀏覽器或代理伺服器,將包含敏感資料的 HTTPS 回應內容儲存在本地快取中時。
雖然快取能顯著提升應用程式的效能,但如果回應中包含了個人身份資訊、金融資料、醫療記錄等敏感內容,這些資料就可能被未經授權的第三方存取。
攻擊原理與範例
此漏洞的風險在共用電腦或網路環境中尤其顯著。
- 場景:假設小美在一台公用電腦(如圖書館、網咖)上登入購物網站,查詢了她的訂單,頁面中顯示了她的姓名、電話和住址。
- 快取儲存:如果網站伺服器沒有正確設定快取策略,這個包含小美個資的頁面可能會被儲存在瀏覽器的快取中。
- 資訊洩漏:小美離開後,下一個使用這台電腦的人,只需點擊瀏覽器的「上一頁」按鈕,或者直接在瀏覽歷史紀錄中找到對應的 URL,就有可能看到先前被快取的頁面,從而獲取小美的個人資訊。
同樣的風險也存在於共用的代理伺服器 (Proxy Server) 上,其他通過此代理上網的使用者也可能存取到被快取的敏感資料。
風險與影響
- 個人隱私洩漏:攻擊者可輕易獲取前一位使用者的個人資料、瀏覽紀錄、帳戶資訊等。
- 帳戶安全威脅:如果快取的頁面中包含 Session Token 或其他敏感憑證,可能導致帳戶被劫持。
防禦與預防措施
防禦此漏洞的核心在於精確地控制快取行為。開發者應透過設定 HTTP 的 Cache-Control
回應標頭,明確告知瀏覽器哪些內容可以快取,哪些不行。
關鍵的 Cache-Control
指令:
private
:
表示回應內容只能被單一使用者的瀏覽器快取,不能被共用的代理伺服器快取。適用於包含個人化內容的頁面。1
Cache-Control: private
no-store
:
最嚴格的指令,完全禁止瀏覽器和任何中介(如代理伺服器)儲存任何形式的回應內容。這是處理極度敏感資料(如銀行帳戶、醫療資訊)時最安全的選擇。1
Cache-Control: no-store
no-cache
:
這個指令並非「不快取」,而是要求瀏覽器在每次使用快取副本前,都必須先向伺服器發送請求,驗證資源是否仍有效。如果伺服器回應304 Not Modified
,才會使用快取。1
Cache-Control: no-cache
開發者應遵守的最佳實踐:
- 預設禁止:對所有包含敏感資訊的頁面,預設使用
Cache-Control: no-store
。 - 謹慎使用
public
:Cache-Control: public
會允許任何中介快取,只應用於完全不含敏感資訊的靜態資源(如 CSS、JS 檔案、公開圖片)。 - 避免在 URL 中傳遞敏感參數:因為 URL 本身也可能被記錄在各種日誌中。
- 加密儲存:如果業務需求必須在客戶端儲存敏感資料,應考慮使用加密手段。
說些什麼吧!