【问题标题】:Firebase Database has insecure rules even though the rules are necessaryFirebase 数据库具有不安全的规则,即使这些规则是必要的
【发布时间】:2020-04-09 12:26:07
【问题描述】:

这被问了很多,但我仍然不知道我能做些什么来消除我每周从 Firebase 收到的警告......

您的 Cloud-Firestore 数据库的规则不安全

你可以猜到我的规则是所有人都可以读写

我的问题是我确实需要它。在注册过程中,我需要访问所有用户的电子邮件和用户名,以检查当前选择的是否可用。用户注册后,他可以搜索其他用户并创建/删除/更改自己的文件。

我不太明白如何摆脱安全问题。威胁在哪里?

【问题讨论】:

  • 如果您的用户只能创建/删除/更新他自己的文件,那么您的规则将不会是读/写 true。
  • 哦,我说得有道理,所以在我的情况下,我需要 all readwrite own files 对吗?那是怎么做的?我的结构基本上是这样的:useres**/(userID)/**documents
  • 你只是描述你自己的规则,只为uid等于用户id的用户写入,而你不需要它的读取部分,制作一个函数来安全地询问用户可用性,创建您拥有所有用户的另一个节点也适用,但会公开信息
  • @cutiko 你知道我的情况的语法吗?用户还有几个子集合,所以下面的答案不起作用
  • 顺便说一句,我在每个用户注册后保存(随机生成的文档名称),每个用户都有一个字段“uid”和他的实际 firebase-userID

标签: firebase google-cloud-firestore firebase-security


【解决方案1】:

正如我在 cmets 中所说,如果您的用户只能创建/删除/更新他自己的文件,那么您的规则将不会是读/写正确的。据我了解,您需要让所有用户都能够阅读,但您希望他们只写入自己的文档。 这样做的方法是将文档 ID 与用户 ID 相同,然后使用以下规则检查它是否有效。

    match /users/{userId} {
        allow write: if request.auth.uid == userId;
        allow read: true;
    }

【讨论】:

  • 我实际上希望每个人都阅读,因为我需要在创建用户之前阅读数据库。顺便说一句,你的回答说写两次,也许编辑一下,我会接受你的回答:)
  • 是的,我错过了输入:P
  • 是的,我知道:D 那么您的答案是否仅对用户有效,或者不是用户的人也可以阅读?
  • 顺便说一句,您甚至可以根据文档中的特定值进行检查。例如,如果您将用户 ID 保存在文档 x 的值中。然后,您可以创建一个规则,说明 x 内的用户 id 字段是否与身份验证用户 id 匹配。
  • 写入仅适用于经过身份验证的用户,读取适用于所有人。如果有人不想登录,您可以匿名验证他的身份。
【解决方案2】:

所以,终于做对了。有了这个解决方案,每个人都可以阅读,而用户只能他们自己的东西。

这是我的代码:

    service cloud.firestore {
  match /databases/{database}/documents {
      match /users/{userId} {
        allow write: if request.auth.uid == userId;
        allow read;
      match /{allSubcollections=**} {
        allow write: if request.auth.uid == userId;
        allow read;
      }
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 2021-12-05
    • 2020-08-08
    相关资源
    最近更新 更多