再來是cookie最後,也是我認為最有意思的一部分--「cookie是怎被保存、保存在哪裡」 。
對於開發後端服務的軟體開發人員,自己應當知道cookie存在哪裡,如何才可以將HTTP Request的狀態保留對應下來。而一般前端人員也不需要很清楚的知道cookie儲存在哪裡,只要認為儲存在瀏覽器內或記憶體內就好。
但是重開機後有一些cookie也存在,這表示必定有一個檔案儲存地方儲存這cookie。
以Google Chrome在Windows平臺為例,Cookie可能儲存在%LocalAppData%\Google\Chrome\User Data\Default\cookies
或%LocalAppData%\Google\Chrome\User Data\Default\Network\cookies
,這要看是什麼版本的若有在更新目前應該是後者。
這是以SQLite作為檔案型資料庫儲存的,因此可以使用對應的工具打開來看看:
不過打開後你會發現:誒!?這資料值為什麼看不懂?
這是因為Chrome在儲存於硬碟之前會先使用一些方式加密後在儲存。以Windows平臺來說會使用DPAPI;Mac上用keyring;Linux可能用dbus或KDE Wallet。
接著有一部分是我自己理解的,並不確定,有可能存在錯誤。
這個概念上,是當使用者登入系統以後,會啟用一個儲存在硬體安全裝置的金鑰,這個金鑰只會儲存在記憶體或加密保護的硬體裝置。軟體可以透過系統層級的API對資料進行加解密,將要儲存的內容透金鑰安全的儲存在硬碟之中;或將加密的資料透過金鑰解密後使用在應用之中。
這麼做可以讓不同的使用者,即使有辦法存取檔案也並無法解讀資料。
在Web服務開發上,除了前端需要注意好安全外,後端服務器更是要配置好Header,這麼一來瀏覽器的保護機制才會起作用,不讓其他網站應用取得不應該取得的資料。
再透過了解Cookie在客戶端儲存於硬碟的方式,雖然對於Web服務開發並沒有直接作用,但做法確實可以好好學習的,如何保護敏感資料的做法。
在一定層度上來說,這緩解了現在多個使用者的作業系統中,不同使用者因為可以相互存取檔案而洩漏資訊。但是在設計開發上,也需要留意不應該將敏感資料直接寫入硬碟,特意還要留意現今作業系統都有虛擬記憶體交換(swap)的機制,這意味著開發上認為只存在與記憶體之中的資料也可能因為短暫的置換而出現在硬碟之中。
不過即使只存在於記憶體之中還是存在幾種攻擊手法。
此外,這裡僅提及Google Chrome儲存Cookie的方式,不代表所有瀏覽器都是這麼做的。
即時有保護,透過同一個使用者下執行的其他惡意程式,仍有可能取得Cookies的原始資料。因此在程式的安裝上,應避免不必要存取特定資料夾的權限。
最後,其實這個探尋的過程也是一種技術的挖掘。瀏覽器會儲存的也不只Cookie,還有LocalStorage、IndexedDB等等。使用到的技術也不一定是SQLite,也有可能是LevelDB。究竟他人是如何實現某些應用功能的?我認為這是非常好的學習方式。
本文同時發表於我的隨筆