首页/安全/漏洞与攻击面速查/并发竞争条件(Race Condition)
Web 漏洞原理与防护55 条

并发竞争条件(Race Condition)

并发请求在『检查-使用』间隙同时通过校验,可造成重复领券、超额提现、绕过限额;防护是把检查与扣减合并为原子操作(数据库约束、条件更新、行锁或队列串行化)。

漏洞与攻击面速查安全更新于 2026-10-12

条件更新(原子且幂等)

条件更新(原子且幂等)
-- 风险:先查余额再扣减,两步之间可能被并发穿插
-- 修复:条件更新一条语句完成
UPDATE account SET balance = balance - 100
WHERE id = 1 AND balance >= 100;
-- 影响行数为 0 表示余额不足,直接拒绝本次请求

其他手段

其他手段
唯一索引防重复记录(同一用户同一活动仅一条)
SELECT ... FOR UPDATE 行锁(注意锁范围与死锁风险)
分布式场景用队列或幂等服务串行化处理
复现并发问题需要并发请求工具(ab、wrk 或自定义脚本),单次点击无法暴露。

易错点

  • 加了唯一约束但不处理冲突异常:并发下后续请求直接 500,问题从漏洞变成稳定性事故

数据来源与参考

  • OWASP 竞争条件相关说明
  • MySQL 8.0 Reference Manual(InnoDB 锁)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌