You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firestore规则优化:防止用户抢占他人文档权限问题

解决Firestore规则中用户抢占文档的问题

这确实是Firestore规则里很容易踩的一个坑!你的分析完全准确——原来的规则没有区分文档创建和文档更新两种场景,导致非所有者可以通过在更新请求中篡改owner_uid字段,把不属于自己的文档占为己有。

优化思路

我们需要把规则拆分成两种场景分别处理:

  • 创建文档时:允许用户将自己的UID设置为owner_uid(这是合理的,毕竟创建者应该成为文档所有者)
  • 更新/删除文档时:仅允许原文档所有者操作,并且禁止修改owner_uid字段,防止所有权被转移

优化后的规则代码

allow write: if 
  // 场景1:创建文档,允许用户设置自己为所有者
  (resource == null && request.auth.uid == request.resource.data.owner_uid) ||
  // 场景2:更新/删除文档,必须是原所有者,且不能修改owner_uid
  (resource != null && 
   request.auth.uid == resource.data.owner_uid &&
   request.resource.data.owner_uid == resource.data.owner_uid);

规则解释

  1. 创建判断:resource == null是Firestore判断文档是否为新建的标准方式,此时用户只能将自己的UID设为owner_uid,确保创建者就是所有者。
  2. 更新/删除判断:
    • request.auth.uid == resource.data.owner_uid:验证操作人是原文档所有者
    • request.resource.data.owner_uid == resource.data.owner_uid:强制owner_uid字段在更新时不能被修改,彻底阻断篡改所有权的可能

额外最佳实践

如果想更严谨,还可以把write拆分成create、update、delete单独定义,规则会更清晰,同时强制创建文档时必须包含owner_uid字段,避免出现无主文档:

allow create: if 
  request.auth.uid != null &&
  request.resource.data.owner_uid == request.auth.uid &&
  request.resource.data.keys().hasAll(['owner_uid']); // 确保必须传入owner_uid字段

allow update, delete: if
  request.auth.uid == resource.data.owner_uid &&
  request.resource.data.owner_uid == resource.data.owner_uid;

内容的提问来源于stack exchange,提问作者w--

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:34:26