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

Jim*_*Jim 1 javascript firebase firebase-security firebase-realtime-database

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

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

在此输入图像描述

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

粉丝节点:

在此输入图像描述

以下节点:

在此输入图像描述

我遇到的麻烦是Firebase建议设置这样的安全规则:

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

fla*_*iza 7

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

 {
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
        "followers": {
          ".write": auth != null
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

您还可以向写入关注者的节点添加验证,!data.exists() && newData.child("uid").val() === auth.uid以防止用户删除/修改其他用户的关注者,并防止添加随机uid作为关注者

编辑:让我们假设您的数据库结构如下:

 {
    users: {
      uid: {
        (user data)
        followers: {
          uid : timestamp
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后规则是:

     {
        "rules": {
          "users": {
            "$uid": {
              ".write": "$uid === auth.uid",
              "followers": {
                "$follower": {
                  ".write": "auth != null && !data.exists() && newData.key() === auth.uid"
            }
          }
Run Code Online (Sandbox Code Playgroud)

这样,一个用户只能在其他用户的关注者节点中写入新条目,并且该条目的密钥必须是他的uid.}}