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);
规则解释
- 创建判断:
resource == null是Firestore判断文档是否为新建的标准方式,此时用户只能将自己的UID设为owner_uid,确保创建者就是所有者。 - 更新/删除判断:
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--
相关产品推荐
相关产品推荐

