Firebase安全问题 - 如何让一个用户更改另一个用户的数据库对象?

时间:2016-11-04 11:15:07

标签: javascript firebase firebase-realtime-database firebase-security

我正在构建一个HTML / JavaScript / CSS前端应用程序,仅使用Firebase作为我的后端(我希望保持这种方式,但我不确定如果没有我想做的话是否可行另一个服务器)。

我正在尝试实施以下/关注者功能。我在Firebase数据库中有一个节点,它基本上是一个用户列表。对象键是用户的auth uid,值是描述该用户对象属性的对象。

enter image description here

我想在我的应用程序中有一个“跟随”按钮,当单击时,会将一个对象与用户的uid一起添加到当前用户的“跟随”对象。此外,我想将当前用户的uid对象添加到被跟踪用户的“关注者”节点。

粉丝节点:

enter image description here

以下节点:

enter image description here

我遇到的问题是Firebase建议设置如下安全规则:

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

这样可以公开您的firebase密钥,因为任何给定的经过身份验证的用户只能在数据库中写入自己的对象。所以我的问题是:允许一个用户修改另一个用户的数据库对象(通过写入其他用户的“关注者”节点)同时仍然阻止任何使用我的Firebase密钥的人恶意写入任何/每个用户的对象,最好的方法是什么?

1 个答案:

答案 0 :(得分:6)

由于firebase dataBase授权会覆盖更高级别的撤销,您可以按原样保留规则,并将所有用户的写入权限授予每个用户的关注者节点:

 {
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
        "followers": {
          ".write": auth != null
      }
    }
  }
}

您还可以向写入跟踪者的节点添加验证,例如!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。             }           }