【问题标题】:Why is this Firebase Database rule being evaluated as true if it's not supposed to?如果不应该将此 Firebase 数据库规则评估为 true,为什么它会被评估为 true?
【发布时间】:2017-08-04 08:33:35
【问题描述】:

我正在 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"
    }
}

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

谢谢

【问题讨论】:

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


    【解决方案1】:

    您正在检查是否"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 而不是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"
        }
    }
    

    【讨论】:

    • 当我把“fgdfg”孩子也拿出来时,验证也通过了。我还在几个地方用datanewData 进行了测试。无论如何,这成功了,谢谢
    猜你喜欢
    • 1970-01-01
    • 2020-08-15
    • 2020-02-06
    • 1970-01-01
    • 2015-03-15
    • 2014-06-17
    • 2013-11-11
    • 1970-01-01
    • 2014-02-16
    相关资源
    最近更新 更多