【问题标题】:"Catch all other" Firebase database rule“捕获所有其他”Firebase 数据库规则
【发布时间】:2016-12-29 04:20:24
【问题描述】:

也许我从 SQL 的角度处理这个问题太多了,但是我在理解如何正确限制应该允许哪些子节点填充节点时遇到了麻烦。

假设我想记录具有任意名称的产品。每个产品都必须包含price,但不允许有其他任何内容。

我的幼稚方法是向要求 newData 包含 price 子节点的产品添加 .validate 规则,明确授予对 price 节点的写访问权限,然后删除所有访问 $other 节点(有点像switch 语句中的默认子句):

{
    "rules": {
        "$product": {
            ".read": true,
            ".write": true,
            ".validate": "newData.hasChildren(['price'])",
            "price": {
                ".write": true,
                ".validate": "newData.isNumber()"
            },
            "$other": {
                ".read.": false,
                ".write": false,
            }
        }
    }
}

这不起作用。使用{"price": 1234, "foo": "bar"} 添加新产品仍将被接受。 如果我向$other 添加".validate": false 规则,则不会接受任何内容(例如,不允许{"price": 1234})。 (不知何故,我做错了。)

有什么方法可以实现类似于我在这里尝试做的事情吗?如果不是,那么在 Firebase 中限制数据结构的正确方法是什么?我应该这样做吗?如果我不这样做,什么会阻止用户用垃圾填充我的数据库?

【问题讨论】:

  • 我不确定我是否理解为什么 "$other": { ".validate": false } 不是您想要的。但是,不管这一点,您是否知道一旦授予权限就不能撤销?那么$product下的".write": true意味着$other下的".write": false被忽略了吗?
  • @cartant 我更新了问题以澄清为什么验证不起作用。

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


【解决方案1】:

您在这里陷入了几个常见的 Firebase 安全坑。最常见的一种是权限级联:一旦您在树中的某个级别授予了读取或写入权限,您就无法在较低级别取消该权限。

这意味着这些规则无效(因为您已经授予读/写更高一级):

"$other": {
    ".read.": false,
    ".write": false,
}

要解决这个问题,您必须意识到.validate 规则是不同的:只有当所有 验证规则都满足时,数据才被认为是有效的。因此,您可以使用验证规则拒绝 $other 数据:

{
    "rules": {
        "$product": {
            ".read": true,
            ".write": true,
            ".validate": "newData.hasChildren(['price'])",
            "price": {
                ".validate": "newData.isNumber()"
            },
            "$other": {
                ".validate": false
            }
        }
    }
}

【讨论】:

  • 这样就解决了。有趣的是,我以为我已经尝试过这个解决方案(就像我在问题中简要提到的那样),但显然我设法以某种方式搞砸了。无论哪种方式,您的回答也让我更清楚地了解了 validate 和 write 之间的区别,所以谢谢您。 :)
  • 这在 Bolt 中看起来如何?
猜你喜欢
  • 2018-09-13
  • 2021-08-16
  • 2019-12-17
  • 1970-01-01
  • 2017-07-15
  • 2017-06-30
  • 2020-02-28
  • 2020-02-24
  • 1970-01-01
相关资源
最近更新 更多