Cookie防篡改機制
服務器可以為每個Cookie項生成簽名,由于用戶篡改Cookie后無法生成對應的簽名, 服務器便可以得知用戶對Cookie進行了篡改。
1. 在服務器中配置一個不為人知的字符串(我們叫它Secret),比如:x$sfz32。
2. 當服務器需要設置Cookie時(比如authed=false),不僅設置authed的值為false, 在值的后面進一步設置一個簽名,最終設置的Cookie是authed=false|6hTiBl7lVpd1P。
3. 簽名6hTiBl7lVpd1P是這樣生成的:Hash('x$sfz32'+'true')。 要設置的值與Secret相加再取哈希。
4. 用戶收到HTTP響應并發(fā)現(xiàn)頭字段Set-Cookie: authed=false|6hTiBl7lVpd1P。
5. 用戶在發(fā)送HTTP請求時,篡改了authed值,設置頭字段Cookie: authed=true|???。 因為用戶不知道Secret,無法生成簽名,只能隨便填一個。
6. 服務器收到HTTP請求,發(fā)現(xiàn)Cookie: authed=true|???。服務器開始進行校驗: Hash('true'+'x$sfz32'),便會發(fā)現(xiàn)用戶提供的簽名不正確。