无需身份验证时,如何保护Firebase数据库分支免受恶意操作?
无需登录认证时Firebase数据库设备检测分支的防护方案
1. 禁止分支级删除与全量覆盖
直接限制整个device_vulnerabilities分支的删除权限,同时仅允许创建新条目或更新现有条目,禁止一次性覆盖整个分支:
{ "rules": { "device_vulnerabilities": { ".delete": false, // 仅允许新增或更新,不允许清空/覆盖整个分支 ".write": "newData.exists() && (!data.exists() || newData.hasChildren(data.keys()))" } } }
2. 强制校验数据结构与字段类型
严格规定上传数据必须包含的字段、类型,拒绝非法格式的垃圾数据:
{ "rules": { "device_vulnerabilities": { "$device_entry": { ".write": true, // 校验必填字段与对应类型 ".validate": "newData.hasChildren(['device_id', 'vulnerability_status', 'scan_time']) && newData.child('device_id').isString() && newData.child('vulnerability_status').isBoolean() && newData.child('scan_time').isNumber()" }, // 禁止直接操作根分支 ".write": false } } }
3. 绑定设备唯一标识,限制单设备仅能操作自身数据
用设备UUID/IMEI等唯一标识作为节点键,确保每个设备只能修改自己的条目,防止篡改他人数据:
{ "rules": { "device_vulnerabilities": { "$device_id": { // 校验上传的device_id与节点键一致 ".validate": "newData.child('device_id').val() === $device_id", // 仅允许创建或更新自身条目,禁止删除 ".write": "newData.exists() && (!data.exists() || data.child('device_id').val() === $device_id)", ".delete": false }, ".write": false } } }
4. 限制单条数据大小与字段数量
防止恶意上传超大数据占用存储空间:
{ "rules": { "device_vulnerabilities": { "$device_entry": { // 单条数据不超过1KB ".validate": "newData.val().length < 1024", // 字段数量不超过5个 ".validate": "newData.numChildren() <= 5" } } } }
5. 启用内置速率限制
在Firebase控制台的Realtime Database设置中开启速率限制,比如限制单个IP每分钟最多10次写入请求,拦截批量恶意操作。
6. 禁止批量操作,强制单节点修改
规则中仅允许操作具体的设备条目,禁止一次性修改多个节点:
{ "rules": { "device_vulnerabilities": { ".write": false, "$device_id": { ".write": true, // 禁止批量增减子节点(若有多层结构) ".validate": "newData.hasChildren() === data.hasChildren()" } } } }
额外优化建议
- 用随机UUID而非可预测的字符串作为节点键,避免恶意枚举条目;
- 定期清理过期数据(如超过30天的扫描记录),缩小攻击面;
- 客户端生成本地存储的设备令牌,上传时携带,规则中校验令牌与设备ID的绑定关系,进一步降低篡改风险。
内容的提问来源于stack exchange,提问作者im narwhal
相关产品推荐
相关产品推荐

