iT邦幫忙

0

Day 23 | 資料隔離:每個人只看得到自己的待辦事項

  • 分享至 

  • xImage
  •  

登入之後,所有人看到的還是同一份清單。今天讓每個查詢都只限定在目前使用者的資料。

今天做的事
routes/todos.js 裡每一條SQL都加上user_id條件,新增時寫入user_id:

db.get(
  'SELECT * FROM todos WHERE id = ? AND user_id = ?',
  [Number(req.params.id), req.user.id],
  ...
);

清單、統計、單筆查詢、編輯、完成、刪除,一共六處都要改。

觀察

  • user_id來自token驗證後的req.user.id,不是前端傳來的參數。如果讓前端傳,任何人都能改成別人的id
  • 就算知道別人的待辦事項id,也沒辦法動它:查不到就回傳404,而不是403,這樣外人連 這個 id 存不存在 都無從得知
  • 漏掉任何一條SQL的AND user_id = ?,那個功能就會變成漏洞,所以要逐條檢查

卡關
一開始不知道怎麼驗證 別人動不了我的資料。後來用兩個帳號測試:先用A新增資料並記下id,再用B的token在Thunder Client去讀取、修改、刪除A的id。

心得
資料隔離的重點不是前端怎麼顯示,而是後端每一次查詢都不能信任前端。這跟第十一天的驗證是同一個觀念:前端只是方便使用者,真正的防線在後端。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言