Cookie防篡改機制


一、為什么Cookie需要防篡改

為什么要做Cookie防篡改,一個重要原因是 Cookie中存儲有判斷當前登陸用戶會話信息(Session)的會話票據-SessionID和一些用戶信息
當發起一個HTTP請求,HTTP請求頭會帶上Cookie,Cookie里面就包含有SessionID。
后端服務根據SessionID,去獲取當前的會話信息。如果會話信息存在,則代表該請求的用戶已經登陸。
服務器根據登陸用戶的權限,返回請求的數據到瀏覽器端。

因為Cookie是存儲在客戶端,用戶可以隨意修改。所以,存在一定的安全隱患。

二、例子

  1. 用戶wall在瀏覽器端輸入用戶名密碼,發起POST請求到后端服務器。后端服務器驗證合法,返回Response,並Set-Cookiesessionid=***;username=wall;
  2. 瀏覽器端在接收到HTTP響應后,發現Set-Cookie,將其存入本地內存或硬盤中。
  3. 瀏覽器端再次發起請求,帶上Cookie信息sessionid=***;username=wall;,請求修改自己的頭像信息。
  4. 服務器根據sessionid驗證當前用戶已登陸,根據username,查找數據庫中的對應數據,修改頭像信息。

如果當前用戶知道username的作用,修改username=pony。再次發起請求,則服務器接收到請求后,會去修改usernamepony的數據。
這樣,就暴露出數據被惡意篡改的風險。

三、防篡改簽名

服務器為每個Cookie項生成簽名。如果用戶篡改Cookie,則與簽名無法對應上。以此,來判斷數據是否被篡改。

原理如下:

  • 服務端提供一個簽名生成算法secret
  • 根據方法生成簽名secret(wall)=34Yult8i
  • 將生成的簽名放入對應的Cookie項username=wall|34Yult8i。其中,內容和簽名用|隔開。
  • 服務端根據接收到的內容和簽名,校驗內容是否被篡改。

舉個栗子:

比如服務器接收到請求中的Cookie項username=pony|34Yult8i,然后使用簽名生成算法secret(pony)=666
算法得到的簽名666和請求中數據的簽名不一致,則證明數據被篡改。

四、敏感數據的保護

鑒於Cookie的安全性隱患,敏感數據都應避免存儲在Cookie。
應該根據SessionID,將敏感數據存儲在后端。取數據時,根據SessionID去后端服務器獲取即可。
另外,對一些重要的Cookie項,應該生成對應的簽名,來防止被惡意篡改。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM