我在Firebase上测试数据的安全性。我最近一直在阅读文档并且我认为我理解它,但是当在模拟器上做这样的事情时,我只是抓着我的头:
规则规定:
"propiedades": {
".read": "auth != null",
".write": "auth != null",
".validate": "data.child('owner').val() === auth.token.sub"
}
并且此特定情况下的data.child('owner').val()
"s0kf6RvEzmfGGjVq9q14GQ6s14H32"
不等于"s0kf6RvEzmfGGjVq9q14GQ6s14H3"
(有一个尾随的“2”),auth.token
也不应该是=== data.child('owner').val()
1}}但具体auth.token.sub
应该是。到底发生了什么事?
作为旁注,即使字符串相等,即使我将规则更改为以下内容,操作仍会进行:
"propiedades": {
".read": "auth != null",
".write": "auth != null",
"$id" : {
".validate": "data.child('owner').val() === auth.token.sub"
}
}
繁重的编辑来自于我正在测试所有可能的组合,一切都违背了我的逻辑。我现在很困惑。
谢谢
答案 0 :(得分:1)
您是否正在检查是否"propriedades/owner" === auth.token.sub
,但在您撰写数据时,您正在写信给"fgdfg"
"propriedades"
的孩子,这意味着您的所有者节点将会最终在"propriedades/fgdfg/owner"
。
你在
的正确轨道上"propiedades": {
".read": "auth != null",
".write": "auth != null",
"$id" : {
".validate": "data.child('owner').val() === auth.token.sub"
}
}
除了您应该使用newData
而不是data
。 data
指的是当前数据库中存在的数据,因为该位置还没有数据(可以说)它总是返回true。 newData
将验证数据的原样和新数据,以便您应该使用的是什么。另外,对我来说,auth.token.sub似乎永远不会工作所以我使用auth.uid代替,如果auth.token.sub适合你,你可以保留它。但我会用auth.uid替换它。
这些是正确的规则:
"propiedades": {
".read": "auth != null",
".write": "auth != null",
"$id" : {
".validate": "newData.child('owner').val() === auth.uid"
}
}