修改Firebase安全规则3天后仍收到整改提醒的解决咨询
现有规则触发安全告警的核心原因
你当前配置的规则仍存在Firebase认定的高危公开访问漏洞,因此会持续收到锁库告警,具体问题如下:
- 全局配置了无任何校验条件的
allow read;,所有匿名未登录用户都可以读取全库任意文档,属于严重的公开读风险 - 写规则存在逻辑冲突:你在最前面配置的
allow write: if request.auth != null;会覆盖后续的create、update限制——Firestore安全规则的判定逻辑是只要匹配任意一条allow规则就放行请求,这条规则等于给所有登录用户开放了全库任意文档的写入、删除权限,你后面写的isMine、时间戳校验完全不会生效 - 未对delete操作做权限约束,结合前面的全局write规则,登录用户可以随意删除全库任意文档
修正后的规则参考
先删除冲突的全局write规则,再收紧全局读权限,补充删除操作的权限校验:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { // 移除原有的无限制全局write规则,拆分细粒度权限 // 全局读默认收紧为仅用户可读取自身id对应的文档,如果你有公开访问的集合,单独针对该集合路径配置读规则即可,禁止全局放开无限制读 allow read: if request.auth != null && request.auth.uid == resource.id; allow create: if isMine() && hasTimestamp(); allow update: if isMine() && hasTimestamp() && isCalm(); // 补充删除操作的权限限制,仅允许文档所属用户操作 allow delete: if isMine(); function isMine() { return request.resource.id == request.auth.uid; } function hasTimestamp() { return request.resource.data.timestamp == request.time; } function isCalm() { return request.time > resource.data.timestamp + duration.value(20, 's'); } } } }
配置后校验要点
- 规则发布后,用Firebase控制台自带的规则模拟器测试未登录访问、非文档所属用户的读写删请求,确认全部被拦截
- 禁止在根通配路径
/{document=**}下配置无任何身份、归属校验的allow read/allow write规则,只要存在这类高危配置,Firebase就会持续发送告警,到期直接锁库 - 如果业务需要部分集合公开可读(比如公开内容、公告类集合),单独匹配对应集合路径配置读规则,不要全局放开权限
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

