为什么这个 Firebase 数据库规则被评估为 true,如果它不应该?
Why is this Firebase Database rule being evaluated as true if it's not supposed to?
我正在 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()
但特别是 auth.token.sub
是应该的。这到底是怎么回事?
附带说明一下,即使字符串相等,即使我将规则更改为如下内容,操作也会继续进行:
"propiedades": {
".read": "auth != null",
".write": "auth != null",
"$id" : {
".validate": "data.child('owner').val() === auth.token.sub"
}
}
大量编辑是因为我正在测试所有可能的组合,但一切都违背了我的逻辑。我现在很困惑。
谢谢
您正在检查是否 "propriedades/owner" === auth.token.sub
但是当您写入数据时,您正在写入 "propriedades"
的子节点 "fgdfg"
这意味着您的所有者节点将在 "propriedades/fgdfg/owner"
。
您
走在正确的轨道上
"propiedades": {
".read": "auth != null",
".write": "auth != null",
"$id" : {
".validate": "data.child('owner').val() === auth.token.sub"
}
}
除了你应该使用 newData
而不是 data
。 data
指的是当前存在于数据库中的数据,因为该位置还没有数据(假设)它总是 returns 为真。 newData
将按原样验证数据和新数据,因此这就是您应该使用的。另外,对我来说,auth.token.sub 似乎从来没有用过,所以我用 auth.uid 代替,如果 auth.token.sub 对你有用,你可以保留它。但我会用 [=29= 代替它].
这些是正确的规则:
"propiedades": {
".read": "auth != null",
".write": "auth != null",
"$id" : {
".validate": "newData.child('owner').val() === auth.uid"
}
}
我正在 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()
但特别是 auth.token.sub
是应该的。这到底是怎么回事?
附带说明一下,即使字符串相等,即使我将规则更改为如下内容,操作也会继续进行:
"propiedades": {
".read": "auth != null",
".write": "auth != null",
"$id" : {
".validate": "data.child('owner').val() === auth.token.sub"
}
}
大量编辑是因为我正在测试所有可能的组合,但一切都违背了我的逻辑。我现在很困惑。
谢谢
您正在检查是否 "propriedades/owner" === auth.token.sub
但是当您写入数据时,您正在写入 "propriedades"
的子节点 "fgdfg"
这意味着您的所有者节点将在 "propriedades/fgdfg/owner"
。
您
走在正确的轨道上"propiedades": {
".read": "auth != null",
".write": "auth != null",
"$id" : {
".validate": "data.child('owner').val() === auth.token.sub"
}
}
除了你应该使用 newData
而不是 data
。 data
指的是当前存在于数据库中的数据,因为该位置还没有数据(假设)它总是 returns 为真。 newData
将按原样验证数据和新数据,因此这就是您应该使用的。另外,对我来说,auth.token.sub 似乎从来没有用过,所以我用 auth.uid 代替,如果 auth.token.sub 对你有用,你可以保留它。但我会用 [=29= 代替它].
这些是正确的规则:
"propiedades": {
".read": "auth != null",
".write": "auth != null",
"$id" : {
".validate": "newData.child('owner').val() === auth.uid"
}
}