【问题标题】:Firebase database rules. How to secure a node from being deleted with .set(null) callFirebase 数据库规则。如何使用 .set(null) 调用保护节点不被删除
【发布时间】:2016-10-21 16:54:13
【问题描述】:

我有这个数据结构。

root
    -foo
        -key0
            -bar1:baz1
            -bar2:baz2
        -key1
            -bar1:baz1
            -bar2:baz2 

我有这个规则结构。

"foo":{
  ".read":true,
  ".write":"auth != null",
  ".validate":"newData.hasChildren(['bar1', 'bar2'])"
}

但是当我尝试在 javascript 控制台上执行此 firebase.database().ref('/foo').remove() 或此 firebase.database().ref('/foo').set(null); 时,未遵守 .validate on 规则,并且正在删除 foo 节点上的数据。

如何保护未与特定用户关联的数据库节点?

【问题讨论】:

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


    【解决方案1】:

    为防止/foo被删除,您可以检查newData.val()不是null

    "foo": {
      ...
      ".write": "(auth != null) && (newData.val() != null)",
      ...
    }
    

    【讨论】:

    • 所以我不会使用".validate" 吗?
    • 它有效,但不是很奇怪吗?还是我觉得这种方法很奇怪?
    • 我猜.validate 可以保留,如果您正在使用它。我想在删除的时候不要使用,否则无法删除定义了.validate的路径。
    • 来自文档:“注意:.validate 规则仅针对非空值进行评估,不会级联。”
    • 文档中的最后一句话确实很关键,找到它here。删除数据不会触发验证规则。因此,为了防止删除,您必须始终实现写入规则。
    【解决方案2】:

    验证步骤被完全跳过,因为允许写入。

    注意:.validate 规则仅针对非空值进行评估,不会级联。

    阅读以下部分,其中包含来自 firebase 文档的非常有用的视频,以保护您的数据。

    https://firebase.google.com/docs/database/security/

    你应该修改你的规则。

    "foo":{
      ".read":true,
      ".write":"auth != null && newData.exists()",
      ".validate":"newData.hasChildren(['bar1', 'bar2'])"
    }
    

    【讨论】:

      猜你喜欢
      • 2021-04-03
      • 2018-06-06
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-15
      相关资源
      最近更新 更多