Firebase 实时数据库在 websocket 连接中泄漏受保护的数据?

Firebase realtime database leaks protected data in websocket connection?

我定义了一个实时数据库规则如下:

{
  "rules": {
    ".read": false,
    ".write": false,
    "devices": {
      ".read": "auth.uid != null && query.orderByChild == 'ownerUid' && query.equalTo == auth.uid",
      "$device": {
        ".read": "data.child('ownerUid').val() == auth.uid",
        "nickname": {
          ".write": "data.parent().child('ownerUid').val() == auth.uid",
          ".validate": "newData.isString() && newData.val().length < 30"
        },
        "ownerUid": {
          ".validate": "root.hasChild('users/' + newData.val())"
        },
        ... additional fields here
      }
    }
  }
}

在我的网络应用程序中,使用 reactfirefirebase npm 模块,我查询了一个设备,如下所示:

const devicesRef = useDatabase()
    .ref(`devices`)
    .orderByChild('ownerUid')
    .equalTo(user.uid);
const { data: devices, status } = useDatabaseListData<Device>(devicesRef, { idField: 'id' });

这似乎有效,但如果我查看“网络”选项卡,我可以看到所有数据都已返回,而不仅仅是应该返回的数据。返回到我的代码的数据是我期望的数据。

请注意下面的屏幕截图,所有 数据都会返回,甚至是没有定义 ownerUid 的数据。

我几乎完全使用文档中的示例:https://firebase.google.com/docs/database/security/rules-conditions#query-based_rules

我是不是做错了什么?或者这是 Firebase 中的错误?

我在升级我的 firebase 客户端版本并从中得到一些新错误后发现了解决方案。原来问题是我在 ownerUid.

上缺少索引

新规则如下所示:

{
  "rules": {
    ".read": false,
    ".write": false,
    "devices": {
      ".indexOn": ["ownerUid"],
      ".read": "auth.uid != null && query.orderByChild == 'ownerUid' && query.equalTo == auth.uid",
      "$device": {
        ".read": "data.child('ownerUid').val() == auth.uid",
        "nickname": {
          ".write": "data.parent().child('ownerUid').val() == auth.uid",
          ".validate": "newData.isString() && newData.val().length < 30"
        },
        "ownerUid": {
          ".validate": "root.hasChild('users/' + newData.val())"
        },
        ... additional fields here
      }
    }
  }
}