為什麼刪除的請求要使用POST或者DELETE
一、前言
最近在專案開發時遇到這樣一個業務請求:一個基礎模組的刪除操作。當時在寫controller時,下意識地寫成了下面的樣子:
@GetMapping("/deleteById") public R deleteById (@RequestParam("id") Long id) { // 相關業務處理 }
雖然我沒有嚴格遵循RESTFUL風格的寫法,但是使用get請求刪除資料還是有些怪怪的!
你肯定看到過這樣的文章“新公司要求介面全部適用POST請求”、“同事因為一個GET請求造成線上Blocker級BUG”。這些問題都最終指向了一個最終的交匯點:Get請求真的那麼的不安全嗎?為什麼?
二、GET,DELETE,PUT和POST
2.1、GET請求
2.2、POST請求
2.3、PUT請求
2.4、DELETE請求
三、GET請求是真正安全的嗎?
上面已經寫到GET請求是安全且冪等的了,為什麼還會有這樣個疑問呢?其實上面的描述是嚴格準守RESTFUL風格的寫法,GET請求僅用於獲取資料資訊,但是你的get請求如果肩負起了除此之外的功能的時候就需要特別注意了!
3.1、 get請求攜帶重要資訊
由於get請求是直接顯示在位址列的,如果請求攜帶了敏感資訊,會有暴露的風險。
PS: 你剛登陸完一個網站,在跳轉到個人中心時,位址列就把你的密碼、銀行卡號、餘額等資訊赤裸裸地展示在了位址列上面...
3.2、容易被劫持、盜刷
如果你的網站安全需求度高,且關鍵操作使用了GET請求,則給自己增加了隱患。
PS: 刪除資料的介面是使用GET請求,我直接從位址列中拿到連線,給你從0到999的資料都請求一遍,甚至寫個指令碼無限請求...
3.3、請求內容限制
GET請求是有長度限制的,相較於POST請求,它的攜帶資料會更小
3.4、其他安全隱患
再如上面的情況,你的一個刪除的介面使用了GET請求,又恰巧被爬蟲訪問、或是被收錄了。這就...
四、後記
說了這麼多,我們可以總結如下:
① GET請求無罪,關鍵還是怎麼去使用它
② 不推薦GET請求肩負起獲取資訊之外的功能操作
③ 如果對安全等級要求過高,慎用GET請求