爲何要作Cookie防篡改,一個重要緣由是 Cookie中存儲有判斷當前登錄用戶會話信息(Session)的會話票據-SessionID和一些用戶信息。
當發起一個HTTP請求,HTTP請求頭會帶上Cookie,Cookie裏面就包含有SessionID。
後端服務根據SessionID,去獲取當前的會話信息。若是會話信息存在,則表明該請求的用戶已經登錄。
服務器根據登錄用戶的權限,返回請求的數據到瀏覽器端。算法
由於Cookie是存儲在客戶端,用戶能夠隨意修改。因此,存在必定的安全隱患。數據庫
wall
在瀏覽器端輸入用戶名密碼,發起POST請求到後端服務器。後端服務器驗證合法,返回Response,並Set-Cookie
爲sessionid=***;username=wall;
。Set-Cookie
,將其存入本地內存或硬盤中。sessionid=***;username=wall;
,請求修改本身的頭像信息。sessionid
驗證當前用戶已登錄,根據username
,查找數據庫中的對應數據,修改頭像信息。若是當前用戶知道username
的做用,修改username=pony
。再次發起請求,則服務器接收到請求後,會去修改username
爲pony
的數據。
這樣,就暴露出數據被惡意篡改的風險。後端
服務器爲每一個Cookie項生成簽名。若是用戶篡改Cookie,則與簽名沒法對應上。以此,來判斷數據是否被篡改。瀏覽器
原理以下:安全
secret
secret(wall)=34Yult8i
username=wall|34Yult8i
。其中,內容和簽名用|
隔開。舉個栗子:服務器
好比服務器接收到請求中的Cookie項username=pony|34Yult8i
,而後使用簽名生成算法secret(pony)=666
。
算法獲得的簽名666
和請求中數據的簽名不一致,則證實數據被篡改。cookie
鑑於Cookie的安全性隱患,敏感數據都應避免存儲在Cookie。
應該根據SessionID,將敏感數據存儲在後端。取數據時,根據SessionID去後端服務器獲取便可。
另外,對一些重要的Cookie項,應該生成對應的簽名,來防止被惡意篡改。session