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

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

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

我正在尝试实现关注/关注者功能。我在 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 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/

相关文章:

javascript - 如何使用 mxGraph 获取 SVG 元素的 ID

javascript - 不完整的 Node HTTP.Response

node.js - 无法执行 "sudo npm install --save firebase-admin"

java - 如何从 firebase 实时数据库获取下一个子项的数据并将其显示在 ListView 中

java - arrayList 是空的 Firebase 数据库

javascript - 更干净更快的 JavaScript,用 JavaScript 替换 jQuery

javascript - JS Javascript 变量泄漏

javascript - 基于 Firebase 中的时间戳进行更新

iOS 应用崩溃在线 Database().reference() of Firebase

Firebase RTD,原子 "move"... 从两个 "tables"删除和添加?