首页 > 解决方案 > 避免父级覆盖的 Firebase 规则

问题描述

在我的数据库中,我在 root 上有一个这样的节点:

-dbroot
--usernameuid
---user1:'someid'
---user2:'someid'
---user3:'someid'

...

为了创建这个,我使用下面的代码:

database().ref('usernameuid/' + that.state.username).set(auth().currentUser.uid).then(() => {

...

最近,我不确定它是如何发生的,但有人设法删除或覆盖了所有--usernameuid节点。

在我的调查中,尽管我正在使用正则表达式检查用户名,但我发现通过了空白用户名。

无论如何,firebase 得到了空白用户名(that.state.username)并覆盖--usernameuid: 'someid'了所有数据。

为了防止这种情况在未来不再发生,(应用程序是实时的,所以不能修改代码)我可以写什么样的 firebase 规则:

  1. 用户只能将孩子添加到--usernameuid
  2. 不能覆盖所有喜欢--usernameuid: 'something'
  3. 不能删除下面的任何东西--usernameuid

标签: firebase-realtime-databasefirebase-security

解决方案


我找到了这样的解决方案:

{
  "rules": {
    ".read": "auth.uid !== null",

...


   "otherchild1": {
      ".write": "auth.uid !== null",
      
      
    },

   "otherchild2": {
      ".write": "auth.uid !== null",
      
      
    },

...

         "usernameuid": {
          "$username" : {
             ".write": "auth.uid !== null",
          }
      
      
    },

摘要:父母没有规则,在您想要的孩子中指定 .write 。但是在 root 上,您需要删除全局 .write 规则并为每个孩子单独指定,因此 firebase 不支持级联规则。


推荐阅读