一、為什麼Cookie需要防篡改 為什麼要做Cookie防篡改,一個重要原因是 Cookie中存儲有判斷當前登陸用戶會話信息(Session)的會話票據 SessionID和一些用戶信息 。 當發起一個HTTP請求,HTTP請求頭會帶上Cookie,Cookie裡面就包含有SessionID。 後端 ...
一、為什麼Cookie需要防篡改
為什麼要做Cookie防篡改,一個重要原因是 Cookie中存儲有判斷當前登陸用戶會話信息(Session)的會話票據-SessionID和一些用戶信息。
當發起一個HTTP請求,HTTP請求頭會帶上Cookie,Cookie裡面就包含有SessionID。
後端服務根據SessionID,去獲取當前的會話信息。如果會話信息存在,則代表該請求的用戶已經登陸。
伺服器根據登陸用戶的許可權,返回請求的數據到瀏覽器端。
因為Cookie是存儲在客戶端,用戶可以隨意修改。所以,存在一定的安全隱患。
二、例子
- 用戶
wall
在瀏覽器端輸入用戶名密碼,發起POST請求到後端伺服器。後端伺服器驗證合法,返回Response,並Set-Cookie
為sessionid=***;username=wall;
。 - 瀏覽器端在接收到HTTP響應後,發現
Set-Cookie
,將其存入本地記憶體或硬碟中。 - 瀏覽器端再次發起請求,帶上Cookie信息
sessionid=***;username=wall;
,請求修改自己的頭像信息。 - 伺服器根據
sessionid
驗證當前用戶已登陸,根據username
,查找資料庫中的對應數據,修改頭像信息。
如果當前用戶知道username
的作用,修改username=pony
。再次發起請求,則伺服器接收到請求後,會去修改username
為pony
的數據。
這樣,就暴露出數據被惡意篡改的風險。
三、防篡改簽名
伺服器為每個Cookie項生成簽名。如果用戶篡改Cookie,則與簽名無法對應上。以此,來判斷數據是否被篡改。
原理如下:
- 服務端提供一個簽名生成演算法
secret
- 根據方法生成簽名
secret(wall)=34Yult8i
- 將生成的簽名放入對應的Cookie項
username=wall|34Yult8i
。其中,內容和簽名用|
隔開。 - 服務端根據接收到的內容和簽名,校驗內容是否被篡改。
舉個慄子:
比如伺服器接收到請求中的Cookie項username=pony|34Yult8i
,然後使用簽名生成演算法secret(pony)=666
。
演算法得到的簽名666
和請求中數據的簽名不一致,則證明數據被篡改。
四、敏感數據的保護
鑒於Cookie的安全性隱患,敏感數據都應避免存儲在Cookie。
應該根據SessionID,將敏感數據存儲在後端。取數據時,根據SessionID去後端伺服器獲取即可。
另外,對一些重要的Cookie項,應該生成對應的簽名,來防止被惡意篡改。