如果已知通配符,则使用通配符读取数据的 Firebase 规则

Firebase rules with wildcards to read data if wildcard is known

我有一个注册系统,我希望只有拥有有效密钥的用户才能注册,我会向想要注册的用户提供该密钥。如果密钥在数据库中,则继续注册。因此,我生成了随机不重复的 8 个字符,并将它们按以下结构存储在实时数据库中:

Secrets:
 "x5f1n9v0":
     "Status" : 1
 "C8vT2xxY":
     "Status" : 1
And so on

..

{
  "rules": {
    "secrets":{
      "$secret": {
        ".read": true,
        ".write": false
      }      
    }
  }
}

关于上述规则的第一个问题:- 在这种情况下,没有人可以添加新的密钥吗? 此外,只有当某人拥有我列表中的有效密钥时,读取才会有效?没有人可以阅读整个列表?这里面有什么错误吗?

现在假设另一组规则,如果用户知道有效 ID,我想写入每个键的子项。

如果我将写入规则更改为 true,这是否有效并且没有漏洞可以破解它?

  "rules": {
    "secrets":{
      "$secret": {
        ".read": true,
        ".write": true
      }      
    }
  }
}

谢谢

In this case no one can add a new secret key?

根据这些第一条规则,只有具有管理权限的人才能添加密钥。

Also the read will only be valid if someone has a valid key from my list? Nobody can read the whole list?

确实无法使用第一组规则阅读整个列表。只有知道密钥的人才能读取秘密。

你的第二套规则:

"secrets":{
  "$secret": {
    ".read": true,
    ".write": true
  }
}

现在任何人都可以写任何秘密。那可能不是你想要的。如果您只想允许他们更改现有密钥下已经存在的数据,您需要检查是否已经有任何数据:

"secrets":{
  "$secret": {
    ".read": true,
    ".write": "data.exists()"
  }
}

如果您希望他们无法 change-but-not-delete 现有数据,那就是 data.exists() && newData.exists()。如果您对用户可以写入的数据格式有其他要求,您需要将这些添加到相应的 .validate 规则中。

你的最后一套规则既无效又毫无意义。它无效,因为 $secrets 未定义。但即使它被定义 $secrets === $secrets 也将永远是 true.