我正在为用户提供一个提取其余额的端点。
因此,在我的http服务中,我会执行以下操作:
var balance = currentBalance - withdrawlAmount;
ProcessWithdrawl(withdrawlAmount);
SaveBalance(balance);
这不是我的真实代码,只是一个用来说明自己的虚构示例。
我已经看到,当攻击者使用许多并行请求来触发不应该允许的操作时,许多流行的服务都会遇到这种麻烦,因为平衡已经耗尽。
防止这种情况的最简单方法是什么?一种想法是我使用静态对象并将代码包装在lock()
语句中。但这一次只能让一个用户余额更新。
如何将锁定范围限定于用户身份验证会话?有没有简单的方法可以做到这一点?
答案 0 :(得分:0)
如评论中所述,由于您需要跨用户会话共享对象,因此我建议在服务器端使用shared / static data structure
,它可以为每个用户提供唯一的对象。
案例1:单台服务器(没有网络花园)-不是群集或网络场
static ConcurrentDictionary<UserId,Object>
,这里UserId
是用户特定的唯一ID string, int, guid
lock(ConcurrentDictionary[UserId]) { ... }
ConcurrentDictionary
用于处理服务器端并发案例2:集群或网络花园/农场
Cache, MQ, Database
之类的分布式数据结构,该结构可以同步特定于用户的请求,并且所有用户都可以访问同一分布式资源