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());
存在的问题分析
数据库规则的安全漏洞
- 权限范围过大:当前
"Layanan Nasabah"节点的读写权限仅验证User节点中存在当前用户的UID,但未限制用户只能访问自己的子节点。这意味着任何已登录且在User节点有记录的用户,都可以读写"Layanan Nasabah"下的所有用户数据,完全违背了"专属读写权限"的需求。 - 规则层级缺失:业务代码中是将数据写入
"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
相关产品推荐
相关产品推荐

