如何防止Firestore数据库遭受计费攻击及DDOS攻击?
针对Firestore计费攻击的防护方案
1. 利用Firebase Auth自定义声明实现无读取成本的速率限制
在安全规则中直接调用ID Token中的自定义声明,无需读取用户文档即可校验请求频率,彻底避免额外读取成本:
- 后端(如Cloud Functions)在用户每次合法赚取金币后,更新其Auth自定义声明中的
last_claim_timestamp为当前时间戳 - 安全规则中校验
request.time与request.auth.token.last_claim_timestamp的间隔(比如设为10秒),拒绝过于频繁的请求
match /users/{userId} { allow update: if request.auth != null && request.auth.uid == userId && request.time > request.auth.token.last_claim_timestamp + duration.value(10, 's') && request.resource.data.gold == resource.data.gold + 1; }
注意:自定义声明每小时最多更新100次/用户,适配游戏中低频率的金币获取场景(比如获胜操作至少间隔数秒)
2. 用Cloud Functions封装写入逻辑,在服务端做速率限制
将客户端直接写Firestore的逻辑改为调用Cloud Functions,在服务层实现更灵活的流量控制:
- 客户端调用Function请求添加金币,而非直接操作Firestore
- Function中使用内存缓存(如
node-cache)或Redis记录用户最近请求时间,校验频率(比如每分钟最多5次请求) - 仅通过校验的请求才执行Firestore写入,无效请求直接拒绝,完全规避Firestore的无效读写成本
- 同时在Function中添加游戏胜利合法性校验,防止客户端伪造胜利请求
3. 启用Firebase App Check拦截非法客户端请求
App Check可验证请求来自你的合法安卓应用,阻止黑客使用伪造SDK或脚本发起批量请求:
- 在安卓应用中集成App Check(使用SafetyNet或Play Integrity)
- 在Firebase控制台启用Firestore的App Check保护,仅允许通过验证的请求访问
4. 设置Firestore配额与账单告警
通过配额和告警提前防范超额费用:
- 在Firebase控制台设置Firestore的每日读写操作限额,超过限额后自动拒绝请求
- 配置Google Cloud账单告警,当费用达到阈值时立即通知,及时处理异常流量
5. 优化安全规则,减少不必要的读取
确保安全规则仅在必要时读取文档数据:
- 避免在规则中使用
get()读取额外文档,尽量使用resource.data或request.auth中的数据 - 对于金币添加操作,严格校验
request.resource.data.gold只能比resource.data.gold多1,防止批量修改
内容的提问来源于stack exchange,提问作者Neo Ajay
相关产品推荐
相关产品推荐

