我正在构建一个仅使用 Firebase 作为后端的 HTML/JavaScript/CSS 前端应用程序(我想保持这种方式,但我不确定如果没有另一台服务器)。
我正在尝试实现关注/关注者功能。我在 Firebase 数据库中有一个节点,它基本上是一个用户列表。对象键是用户的 auth uid,值是描述该用户对象属性的对象。
我想在我的应用程序中有一个“关注”按钮,单击该按钮时,会将一个对象与被关注用户的 uid 添加到当前用户的“关注”对象。另外,我想将一个具有当前用户 uid 的对象添加到被关注用户的“关注者”节点。
追随者节点:
以下节点:
我遇到的问题是 Firebase 建议像这样设置他们的安全规则:
{
"rules": {
"users": {
"$uid": {
".write": "$uid === auth.uid"
}
}
}
}
这样就可以公开您的 firebase key ,因为任何给定的经过身份验证的用户只能写入数据库中他自己的对象。所以我的问题是:允许一个用户修改另一个数据库对象(通过写入另一个用户的“关注者”节点)同时仍然防止任何拥有我的 Firebase key 的人恶意写入任何/每个用户的对象的最佳方法是什么?
最佳答案
由于 firebase 数据库授权会覆盖更高级别的撤销,您可以保留规则不变,并向所有用户授予对每个用户的关注者节点的写入权限:
{
"rules": {
"users": {
"$uid": {
".write": "$uid === auth.uid"
"followers": {
".write": auth != null
}
}
}
}
也可以在写给follower的节点上加上验证比如!data.exists() && newData.child("uid").val() === auth.uid
到防止用户删除/修改其他用户的关注者,并防止添加随机 uid 作为关注者
编辑: 假设您的数据库结构如下:
{
users: {
uid: {
(user data)
followers: {
uid : timestamp
}
}
}
}
那么规则就是:
{
"rules": {
"users": {
"$uid": {
".write": "$uid === auth.uid",
"followers": {
"$follower": {
".write": "auth != null && !data.exists() && newData.key() === auth.uid"
}
}
这样一来,一个用户只能在其他用户的关注者节点中写入新条目,并且该条目的键必须是他的 uid。 }
关于javascript - Firebase 安全问题——如何让一个用户更改另一个用户的数据库对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40421271/