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

Firebase实时数据库读写规则配置及代码问题排查求助

Firebase Realtime Database权限规则与业务代码问题排查

问题背景

需要配置Firebase实时数据库规则,实现登录账号的专属读写权限控制,以下是提供的规则代码与业务逻辑代码,排查其中存在的问题:

提供的数据库规则

{
  "rules": {
    "User": {
      "$uid": {
        ".read": "auth !== null && auth.uid === $uid",
        ".write": "auth !== null && auth.uid === $uid"
      }
    },
    "Layanan Nasabah": {
      ".read": "root.child('User/' + auth.uid).exists()",
      ".write": "root.child('User/' + auth.uid).exists()"
    }
  }
}

提供的业务代码(Java)

database.child("Layanan Nasabah").child(mAuth.getUid()).setValue(new pengaduan
            (getNo,getNo_Tiket,getNama_Penelpon,getPenelpon1,getPenelpon2,getEmail,getPertanyaan,getTertanggung,getNo_Polis,getObyek,getCatatan)).addOnSuccessListener(unused -> {
        Toast.makeText(TambahActivity.this, "Data Berhasil Disimpan", Toast.LENGTH_SHORT).show();
        startActivity(new Intent(TambahActivity.this, OnprogressActivity.class));
        finish();

    }).addOnFailureListener(e ->
        Toast.makeText(TambahActivity.this, "Data Gagal Disimpan", Toast.LENGTH_SHORT).show());

存在的问题分析

数据库规则的安全漏洞

  1. 权限范围过大:当前"Layanan Nasabah"节点的读写权限仅验证User节点中存在当前用户的UID,但未限制用户只能访问自己的子节点。这意味着任何已登录且在User节点有记录的用户,都可以读写"Layanan Nasabah"下的所有用户数据,完全违背了"专属读写权限"的需求。
  2. 规则层级缺失:业务代码中是将数据写入"Layanan Nasabah/$uid"路径,但规则未针对$uid层级做权限控制,导致权限逻辑和业务逻辑不匹配。

业务代码的潜在问题

业务代码本身的逻辑是正确的(将数据写入当前用户UID对应的子节点),但由于规则的权限范围过大,无法保障数据的私密性,同时如果后续出现误写其他用户节点的情况,规则也无法阻止。

修正后的数据库规则

{
  "rules": {
    "User": {
      "$uid": {
        ".read": "auth !== null && auth.uid === $uid",
        ".write": "auth !== null && auth.uid === $uid"
      }
    },
    "Layanan Nasabah": {
      "$uid": {
        ".read": "auth !== null && auth.uid === $uid && root.child('User').child(auth.uid).exists()",
        ".write": "auth !== null && auth.uid === $uid && root.child('User').child(auth.uid).exists()"
      }
    }
  }
}

修正说明

  • 为"Layanan Nasabah"添加$uid层级规则,确保用户只能读写自己UID对应的子节点。
  • 同时保留root.child('User').child(auth.uid).exists()的验证,确保只有在User节点存在记录的用户才能访问该路径,避免非法用户的访问。
  • 路径拼接改为root.child('User').child(auth.uid),比字符串拼接更符合Firebase规则的写法规范。

内容的提问来源于stack exchange,提问作者Panji Andrian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:50:26