如果不应该将此Firebase数据库规则评估为true,为什么?

时间:2017-03-14 05:55:34

标签: firebase firebase-realtime-database firebase-security

我在Firebase上测试数据的安全性。我最近一直在阅读文档并且我认为我理解它,但是当在模拟器上做这样的事情时,我只是抓着我的头:

Firebase WTF

规则规定:

"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"
    }
}

繁重的编辑来自于我正在测试所有可能的组合,一切都违背了我的逻辑。我现在很困惑。

谢谢

1 个答案:

答案 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而不是datadata指的是当前数据库中存在的数据,因为该位置还没有数据(可以说)它总是返回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"
    }
}