无认证Firebase实时数据库防根节点误删的安全规则配置问题
正确的Firebase实时数据库安全规则如下
{ "rules": { // 根节点默认禁用所有读写,从根源避免全局误操作 ".read": false, ".write": false, // ChatListing节点规则配置 "ChatListing": { ".read": true, // 仅允许写入有效数据,自动拦截删除操作(删除时newData为null,exists()返回false) ".write": "newData.exists()", // 子节点继承上层规则即可,无需额外配置 "$userGroup": { "$chatSessionId": { ".read": true, ".write": "newData.exists()" } } }, // 根节点下的聊天密钥节点规则配置(通配符匹配除ChatListing外的所有根级子节点) "$chatId": { ".read": true, // 直接操作聊天密钥根节点时,仅允许新增,禁止修改、删除已有节点 ".write": "!data.exists() && newData.exists()", // 聊天密钥节点下的消息子节点放开读写,支持正常收发消息 "$messageId": { ".read": true, ".write": true } } } }
规则逻辑说明
- 根节点默认关闭所有权限,彻底杜绝误调用根节点
setValues清空全库的风险 - ChatListing节点完全匹配需求:允许创建、读取、修改元数据,禁止任何删除操作
- 聊天密钥节点完全匹配需求:仅允许在根层级新增会话节点、读取已有会话数据,会话内部的消息收发不受限制
原有规则失效原因
你之前配置的根节点.write: "!data.exists() || !newData.exists()"等价于允许「向空节点写入数据」和「删除已有节点」,刚好支持了在根节点调用setValues清空全库的操作,完全不符合安全要求。
内容的提问来源于stack exchange,提问作者Faizan Naeem
相关产品推荐
相关产品推荐

