惡意提交攻擊
1.攔截且修改:客戶端發送到服務端接口的請求被第三方攔截,然后修改數據,再提交給客戶端執行
例如:
- 客戶端發送了將username重置為“小明”的請求
- 第三方攔截后修改為username重置為"小紅"
- 然后提交給服務器執行
- 服務器認證了用戶身份后(cookie或token都是客戶端發出的,因此能通過認證)
- 那么客戶端的username就被修改為“小紅”
2.攔截不修改,重復提交攻擊
例如:
- 客戶端發送一個更新user表的請求
- 第三方攔截
- 然后短時間內復制重復提交
- 服務器認證后不斷往數據庫寫數據
解決方案--簽名:對客戶端發來的請求進行簽名
1.防篡改
- 客戶端提交請求之前,先對自己請求的參數全部進行拼接加密得到一個加密字符串sign
- 請求參數加上sign,然后再發送給服務器
- 服務器將參數獲取后也進行相同的拼接加密得到自己的sign
- 比較與客戶端發來的sign是否相同
- 不相同則是被第三方修改過的,拒絕執行
關鍵:
- 第三方不知道加密方式和請求參數拼接規則,而客戶端與服務器是知道的,因此第三方不知道修改參數后如何生成與服務器生成相同的sign
- 只要請求修改了一點點加密得到的就是不同的簽名
2.防重放
(1)客戶端的請求參數上加一個請求時間timestamp
原理:服務器獲取請求的timestamp,然后比較自身系統時間,如果相差超過設定時間就是超時,該請求無效
作用:就算第三方截取了該請求,它也只能在設定時間內進行重放攻擊
(2)客戶端的請求參數上加一個隨機字符串string
原理:服務端獲取請求的隨機字符串string,然后查看是否在設定時間內別的請求使用過該string,被使用過就判定無效
作用:加上timestamp,就造成短時間內一個請求只能使用一次,因為就算請求被攔截,它請求成功一次后,第二次復制重放時就因為隨機字符串被使用而被拒絕
----------------------------------------以前的答案---------------------------------------------
// 1.使用session驗證身份(查看id與session中id是否一致)
// 2.對id進行加密處理等(如果id被惡意修改,篡改者不知道加密方法則服務端可查證)
// 3.設置提交的間隔時間限制來防止重復提交
// 4.在session中設置提交標志(每一次服務器將表單呈現給客戶端前設置一個標志,然后客戶端提交表單時再驗證該標志)