当前位置: 首页 > 知识库问答 >
问题:

Firebase实时数据库-不安全规则

柴英锐
2023-03-14

我在Firebase中收到一条消息,告诉我我的项目实时数据库有不安全的规则。但当我检查它时,我不太明白什么是不安全的。

它显示如下:

{
  "rules": {
    ".read": true,
    ".write":  "(auth != null) && (auth.uid ==   '123...myUID ...xyz')",
    "CollectionOne": {
      ".indexOn": ["name", "url"]
    },
    "CollectionTwo": {
      ".indexOn": ["name"]
    }
  }
}

我保留了读取访问权限,因为它支持一个网站。所以任何访问该网站的人都应该能够读取数据。

至于写权限,据我所知,我是唯一能写的人。

请注意,我还有第三个系列(CollectionThree),规则中没有提到。这可能是原因吗?

除此之外,我还可以想象,只有web服务器可以获得读取权限,以便将内容提供给访问者,而不是直接提供给任何人,但我认为情况并非如此。如果是这样的话,我就不知道该如何设定这个规则。

如果有人能解释这一点,那将是有益的。

共有2个答案

舒阳州
2023-03-14

Firebase文档建议使用更具体的规则。(所以给每个集合你给整个数据库的规则肯定会有所帮助)

其中一个原因如下:

规则作为OR语句应用,而不是AND语句。因此,如果多个规则匹配一条路径,并且任何匹配的条件都授予访问权限,则规则将授予对该路径上的数据的访问权限。因此,如果一个广泛的规则允许访问数据,就不能用更具体的规则进行限制。然而,你可以通过确保你的规则没有太多重叠来避免这个问题。Firebase安全规则标志在匹配路径中重叠,作为编译器警告。

你可以在这里找到更多关于这个主题的信息

慕阳平
2023-03-14

任何访问该网站的人都应该能够读取数据。

虽然这是一个有效的要求,但现在即使没有访问您网站的人也可以通过一个调用读取整个数据库。事实上,这就像打开网址https://一样简单

通常,代码将以更细粒度的级别访问数据。事实上,看看您的规则,我希望您的代码运行查询或访问CollectionOneCollectionTwo的各个子节点。如果应用程序代码就是这样做的,那么这也是安全规则应该允许的。

因此,更好的一步是:

{
  "rules": {
    ".write":  "(auth != null) && (auth.uid ==   '123...myUID ...xyz')",
    "CollectionOne": {
      ".read": true,
      ".indexOn": ["name", "url"]
    },
    "CollectionTwo": {
      ".read": true,
      ".indexOn": ["name"]
    }
  }
}

现在,我上面展示的URL模式将不再有效,恶意用户必须知道顶级节点的名称才能访问其中的数据。

有关这方面的更多信息,请参见:

  • 应该对Firebase中的读取应用哪些安全规则?
  • Firebase邮件说我的实时数据库有不安全的规则

 类似资料:
  • 我创建了一个应用程序,它使用Firebase实时数据库。我对安全规则有一个很大的问题。我的用户不需要登录使用应用程序,他们可以发送数据到数据库,无需任何身份验证。例如:这是一个简单的游戏,他们可以互相玩,然后他们可以保存分数。我想创建一个安全的数据库,但是任何人都可以写

  • 好的,我有一个实时数据库连接到一个应用程序,直到今天规则(读写)都设置为真,一切都很好。。。。但每次有消息说 您的安全规则定义为public,因此任何人都可以窃取、修改或删除数据库中的数据 我尝试了几件事,但没有访问数据。。。只有当规则设置为true时,才能访问数据 但有没有办法修改规则,使其更安全 我希望只有少数已知的应用程序(我的应用程序)可以访问此数据

  • 我在Android Studio中创建了一个应用程序,并将其与Firebase实时数据库链接。我需要执行3次验证: > 由Firebase通知服务生成的一次性PIN和手机验证。 在下一个屏幕上,用户的pin会根据我的数据库进行检查,最后他会进入菜单屏幕。 现在,我不知道应该设置什么作为我的安全规则,因为身份验证是在第2步进行的,所以我不能使用“auth”来设置规则,如果没有“auth”,数据库将是

  • 我需要一些帮助来保护我的数据库。 我的数据库如下所示(我使用的是电话号码,而不是uid): 如您所见,在用户节点下有经过身份验证的用户的电话号码。我的目标是保护数据库,这样用户就可以读写自己的数据。 我尝试了以下代码,以允许每个用户读取和写入自己的数据: 但每当我在规则游乐场或我的应用程序上尝试这一点时,我都会被拒绝: 你们能帮我解决吗?

  • 我需要一些帮助来保护我的数据库。 以下是我的安全规则: 我尝试了以下代码,以允许每个用户读取和写入自己的数据: 我的数据库如下所示(我使用的是电话号码,而不是uid): 但是由于某种原因,当我运行Firebase规则游乐场时,给定的auth.token.phone数等于我给出的确切位置,例如,我被拒绝读取选项。 这也发生在我的应用程序中,你们能帮我解决吗?

  • 我正在做一个我想在firebase实时数据库上运行的项目。我用以下格式创建了一个数据库设置: 我的安全规则如下所示: 我试图存档,每个人都可以阅读“马”、“图像”和“视频”中的详细信息,但只有经过身份验证的用户才能在“马”、“图像”和“视频”中添加自己的条目(由firebase auth提供的用户ID检查)。 我的第一个问题是:我应该把“图像”和“视频”作为“马”的子对象吗?如果我能为马写一条读写