首页/安全/渗透测试与安全评估速查/竞争条件检查(并发时序)
常见漏洞验证121 条

竞争条件检查(并发时序)

并发场景下的校验时序问题:库存、余额、次数限制、优惠领取;用小规模可控并发验证幂等与原子性。

竞争条件查什么

竞争条件指并发场景下校验发生时序错位:两次请求几乎同时通过了“库存还有”“次数没用完”“券还没领过”的判断,于是限制被突破。高发功能是限次操作、库存扣减、优惠领取与核销、余额与积分。验证思路是用少量并发加最终状态核对,而不是压测——目标是证明幂等与原子性是否存在缺口。

基本信息

适用对象限次功能、库存扣减、领取与核销、余额与积分
验证方法测试账号 + 少量并发(如 3-5 路)+ 最终状态核对
观察信号超出限制的最终状态、重复记录、数据不一致
止损要求发现越限立即停止并恢复数据

典型使用场景

  • 秒杀与限量活动上线前的并发校验核查
  • 排查“一码多用”“一次领多份”类业务问题
  • 验证分布式部署下锁的实现是否真正生效
  • 评估退款、补发等补偿流程的并发安全性
  • 为业务方提供可落地的原子化改造建议

验证步骤(测试环境)

验证步骤(测试环境)
1. 选带次数或库存约束的功能,确认基线状态(剩余数量、已用次数)
2. 用测试账号并发发送少量等价请求(先 3 路,再视情况加到 5 路)
3. 核对最终状态:限制是否被突破、是否产生重复记录、金额是否异常
4. 记录请求时序(时间戳)与最终状态截图,安排数据恢复
5. 结论区分“服务端未加锁”与“锁粒度不足”两类原因

对象与并发风险

对象并发风险期望实现
库存扣减超卖数据库条件更新或分布式锁
领取类操作重复领取唯一约束 + 幂等键
次数限制越限使用原子计数与预占
余额与积分重复扣减或加计事务内校验并落库
核销与退款重复核销状态机 + 唯一业务键
并发验证会产生真实业务数据:限定测试账号、控制并发数、确保随时可回滚,并避开促销与业务高峰时段。
只在一台实例上验证不能代表集群行为:分布式场景下应确认锁是否落在共享存储(数据库、Redis)上,否则多实例部署时限制仍然可被突破。

易错点

  • 在促销时段对真实库存做并发验证,直接影响业务成交
  • 并发数开得过大,从验证变成压测,造成服务不稳定
  • 只测单实例环境,忽略多实例部署下锁失效的问题
  • 只看接口返回成功与否,不核对数据库最终状态
  • 验证后未恢复测试数据,遗留的异常记录干扰后续对账

数据来源与参考

  • OWASP WSTG WSTG-BUSL-04(Process Timing)
  • CWE-362(Race Condition)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌