如果已知通配符,Firebase会使用通配符来读取数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果已知通配符,Firebase会使用通配符来读取数据相关的知识,希望对你有一定的参考价值。

我有注册系统,我只希望用户注册,如果他们有一个有效的密钥,我将提供给想要注册的用户。如果key在db中,则继续注册。因此,我生成了随机非重复的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
      }      
    }
  }
}

谢谢

答案

在这种情况下,没有人可以添加新的密钥?

使用这些第一规则,只有具有管理访问权限的人才能添加密钥。

只有当某人有我的列表中的有效密钥时,读取才有效吗?没有人可以阅读整个清单?

确实没有办法用你的第一套规则读取整个列表。有人只有在知道密钥的情况下才能阅读秘密。

使用第二套规则:

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

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

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

如果您希望他们无法更改但不删除现有数据,那将是data.exists() && newData.exists()。如果您对用户可以编写的数据格式有其他要求,则需要将这些要求添加到相应的.validate规则中。

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

以上是关于如果已知通配符,Firebase会使用通配符来读取数据的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 数据库规则中的通配符

mysql必知必会--用通配符进行过滤

如何在 Firebase 中使用通配符?

Firebase 规则通配符和子级比较

如何从 Firebase 云函数中的通配符获取数据

MySQL必知应会-第8章-用通配符进行过滤