如何使用 Firebase 安全规则仅允许指定的 child 名称进行写入操作

How to allow only specified child names for write operation with Firebase Security Rules

我有一个用户节点,其中我的用户数据仅包含 uid、姓名和年龄,如下所示:

{
  "user_1": {
    "uid": "user_1",
    "name": "Alex",
    "age": 35,
  }
}

我想我可以使用 hasChildren 方法来防止任何人添加 child 除了我指定的那些:

"users": {
  "$uid": {
    ".read": "auth != null",
    ".write": "auth != null",
    ".validate": "newData.hasChildren(['uid', 'name', 'age'])",
  },
}

但是,它不起作用,因为用户只要提供uid、姓名和年龄就可以添加任何他们想添加的内容。我总是在客户端检查数据,但是恶意的人可以找出 api 并添加不必要的东西。有办法解决这个问题吗?

文档中没有关于这个问题的任何内容,但我在谷歌上搜索并找到了一些东西。在您的节点中包含一个额外的通配符并使 .validate 始终为 false 会在新数据具有您指定的键以外的子键时拒绝该操作。

"users": {
  "$uid": {
    ".read": "auth != null",
    ".write": "auth != null",
    ".validate": "newData.hasChildren(['uid', 'name', 'age'])",
    // Make sure you specify all keys you want to allow
    // so the wildcard won't match them
    "uid": { ".validate": "newData.isString()" },
    "name": { ".validate": "newData.isString()" },
    "age": { ".validate": "newData.isNumber()" },
    // Add this wildcard below and make it false always
    "$other": { ".validate": false }
  }
}

不要忘记您应该在节点中包含所有键。

查看 this 了解更多信息。