Firebase实时数据库规则的安全性

问题描述

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

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

我已经在redux存储中签入了,它似乎可以工作。我叫动作创建者,当我是普通用户时会在组件中获取用户并访问它,我发现redux存储中的users节点仍然为空...当我以管理员身份登录并转到该组件时,看到用户节点已被填充...似乎可以正常工作,但是我想确保这是一种安全的工作方式,因为让每个人都写到表中的感觉很不妙:-)但是就像我说的那样,表本身不用于授权任何东西,所以也许还可以.....

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

诚挚的问候, 大卫

解决方法

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

只要您确保仅授权用户拥有isAdmin == true,就不会以这种方式泄漏信息的固有安全风险。


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

该如何执行取决于用户写给/users的方式和内容。例如,如果他们在自己的个人资料下编写自己的用户个人资料,并且您使用其UID作为密钥,则可以确保用户只能使用以下方式编写自己的个人资料:

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

如前所述,这取决于您编写的实际数据,因此,您需要查看securing data access上的Firebase文档并针对您的用例进行实现。


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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...