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

时间:2018-04-07 17:11:49

标签: firebase firebase-realtime-database wildcard firebase-security-rules

我有注册系统,我只希望用户注册,如果他们有一个有效的密钥,我将提供给想要注册的用户。如果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
      }      
    }
  }
}

由于

1 个答案:

答案 0 :(得分:0)

  

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

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

  

只有当某人拥有我的列表中的有效密钥时,该读取才有效吗?没人能读完整个清单吗?

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

使用第二套规则:

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

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

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

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

你的最后一套规则既无效又毫无意义。它无效,因为未定义$secrets。但即使已定义$secrets === $secrets,也始终为true