首页 > 解决方案 > firebase 实时数据库规则的安全性

问题描述

在我的应用程序中,我使用自定义声明为用户分配角色。管理员可以使用时髦的切换按钮(使用云功能)更改人员的角色,因此(s)他需要查看所有用户的列表......但另一方面,当用户注册时,他们需要被添加到用户数据库集合中。这个集合显然不用于授权任何事情,但它只是为了让管理员可以更改该集合中用户的角色。所以管理员需要能够读取表格并且每个人都需要能够在集合中写入......所以我在这方面的规则如下所示:

    {
      "rules": {
        "users": {
          ".read": "auth.token.isAdmin === true",
          ".write": true
        },

我已经检查了 redux 商店,它似乎工作。我调用动作创建者来获取组件中的用户并在我是普通用户时访问它,我看到 redux 存储中的用户节点仍然为空......当我以管理员身份登录并转到组件时看到用户节点已填满......所以它似乎工作,但我想确保这是一种安全的工作方式,因为让每个人都写信给表格感觉不对:-)但就像我说的那样,表格本身不用于授权任何东西,所以也许没关系......

感谢您对此的任何意见:-)

亲切的问候, 大卫

标签: reactjsfirebasefirebase-realtime-databasefirebase-security

解决方案


您所拥有的是一种相当常见的模式:每个人都可以编写请求,但只有授权用户才能读取请求。

只要确保只有授权用户拥有isAdmin == true.


但是现在任何用户都可以向/users节点写入他们想要的任何内容。这也意味着任何用户都可以通过一个简单的firebase.database().ref("users").remove()调用来删除所有现有数据。这可能是您要防止的事情。

如何做到这一点取决于用户写入的方式和内容/users。例如,如果他们在其下编写自己的用户配置文件,而您使用他们的 UID 作为密钥,则可以确保用户只能使用以下内容编写自己的配置文件:

{
  "rules": {
    "users": {
      ".read": "auth.token.isAdmin === true",
      "$uid": {
        ".write": "auth.uid === $uid"
      }
    }
  }
}

如前所述,这取决于您编写的实际数据,因此您需要查看 Firebase 文档以保护数据访问并为您的用例实施该文档。


我要考虑的另一件事是限制用户可以写入数据库中此节点的内容。例如,您可以使用.validate规则来限制他们可以写入的值,甚至可以使用.write规则来确保用户只写入自己的数据。


推荐阅读