Cookie防篡改機制

1、爲何Cookie須要防篡改

爲何要作Cookie防篡改,一個重要緣由是 Cookie中存儲有判斷當前登錄用戶會話信息(Session)的會話票據-SessionID和一些用戶信息。 當發起一個HTTP請求,HTTP請求頭會帶上Cookie,Cookie裏面就包含有SessionID。 後端服務根據SessionID,去獲取當前的會話信息。若是會話信息存在,則表明該請求的用戶已經登錄。 服務器根據登錄用戶的權限,返回請求的數據到瀏覽器端。git

由於Cookie是存儲在客戶端,用戶能夠隨意修改。因此,存在必定的安全隱患。github

2、例子

username是爲了通俗易懂地解釋這個概念,實際項目都不會這麼作的,周知。算法

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

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

3、防篡改簽名

服務器爲每一個Cookie項生成簽名。若是用戶篡改Cookie,則與簽名沒法對應上。以此,來判斷數據是否被篡改。後端

原理以下:瀏覽器

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

舉個栗子:安全

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

4、敏感數據的保護

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


喜歡我文章的朋友,能夠經過如下方式關注我:code

相關文章
相關標籤/搜索