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
}
}
}
}
在我的网络应用程序中,使用 reactfire
和 firebase
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
}
}
}
}
我定义了一个实时数据库规则如下:
{
"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
}
}
}
}
在我的网络应用程序中,使用 reactfire
和 firebase
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
}
}
}
}