gpt4 book ai didi

firebase - "Catch all other"Firebase 数据库规则

转载 作者:行者123 更新时间:2023-12-04 23:40:25 24 4
gpt4 key购买 nike

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

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

我天真的方法是添加一个 .validate要求 newData 包含 price 的产品的规则child,明确授予对 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"}仍然会被接受。但是,如果我添加一个 ".validate": false规则到 $other , 不接受任何东西(例如 {"price": 1234} 是不允许的)。 (不知何故,我做错了。)

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

最佳答案

您在这里陷入了一些常见的 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
}
}
}
}

关于firebase - "Catch all other"Firebase 数据库规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39082513/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com