java中可以使用token来进行拦截重复提交问题,
nodejs中是否有相关的插件或者module来解决这个安全问题。。
理论上来说,越简单越好。。。队列什么的,唉。。
参考cnode中《node.js 在服务器端避免重复提交有没有什么好办法吗?》
小伙看你根骨奇佳,潜力无限,来学PHP伐。
最簡單的方法是在客戶端那邊去做限制,在最後一個請求沒回應回來之前不能發起另外的請求。
服務端這邊方法也有很多,
最簡單在資料庫層級防止重複資料寫入
用一些 RateLimit 定義規定時間內同一操作不能超過多少次,如果你用的是 Express 可以用這個 https://github.com/nfriedly/express-rate-limit
如你所提到的採用佇列寫入
每次提交都需要申請一個 token ,每個 token 只能用一次
@KaiChen :3Q 4 U answer ~~
我用express-rate-limit實現了一下,
在不改寫這個module(以下簡稱rl)的前提下,會有幾個問題:
首先,看源碼,rl將req.ip存放在一個全域變數中,當使用nginx做反向代理的時候,所有的req.ip會指向nginx的代理ip位址,所以這個rl在生產上應該會變現出ip重複問題
其次,max限制次數的邏輯問題,當設定max大於1之後,次數越多,請求的延遲時間越長,找到一個解決方法是設定【delayMs:0】
最主要的,他的返回message只支援string型,“first argument must be a string or Buffer”,在res的返回中,我們絕大部分使用的是res.json,純string數據需要使用正規去進行比對來判斷是否為成功請求。
最簡單的方法是在客戶端那邊去做限制,在最後一個請求沒回應回來之前不能發起另外的請求。
服務端這邊方法也有很多,
最簡單在資料庫層級防止重複資料寫入
用一些 RateLimit 定義規定時間內同一操作不能超過多少次,如果你用的是 Express 可以用這個 https://github.com/nfriedly/express-rate-limit
如你所提到的採用佇列寫入
每次提交都需要申請一個 token ,每個 token 只能用一次
@KaiChen :3Q 4 U answer ~~
我用express-rate-limit實現了一下,
在不改寫這個module(以下簡稱rl)的前提下,會有幾個問題:
首先,看源碼,rl將req.ip存放在一個全域變數中,當使用nginx做反向代理的時候,所有的req.ip會指向nginx的代理ip位址,所以這個rl在生產上應該會變現出ip重複問題
其次,max限制次數的邏輯問題,當設定max大於1之後,次數越多,請求的延遲時間越長,找到一個解決方法是設定【delayMs:0】
最主要的,他的返回message只支援string型,“first argument must be a string or Buffer”,在res的返回中,我們絕大部分使用的是res.json,純string數據需要使用正規去進行比對來判斷是否為成功請求。