我在Firebase中收到一条消息,让我知道我的项目Realtime database有不安全的规则。但是当我检查它时,我不太明白什么是不安全的。
它是这样出现的:
{
"rules": {
".read": true,
".write": "(auth != null) && (auth.uid == '123...myUID ...xyz')",
"CollectionOne": {
".indexOn": ["name", "url"]
},
"CollectionTwo": {
".indexOn": ["name"]
}
}
}我离开了读取访问的方式,因为这是支持一个网站。因此,任何访问该网站的人都应该能够阅读这些数据。
至于写的权限,据我所见,我是唯一会写作的人。
请注意,我有第三个集合(CollectionThree),这在规则中没有提到。这就是原因吗?
此外,我还可以想象,为了向访问者提供内容,而不是直接向任何人提供读取访问权限,可以只访问web服务器,但我不认为是这样的。如果是这样的话,我就不知道该怎么制定这个规则了。
如果有人能弄清楚这件事,那会很有帮助的。
发布于 2021-10-18 14:21:58
任何访问该网站的人都应该能够阅读这些数据。
虽然这是一个有效的要求,但现在即使是没有访问您的网站的人也可以通过一个调用读取整个数据库。实际上,打开URL (或类似的https://<yourproject>.firebaseio.com/.json )就可以从我们的数据库中抓取所有数据。
通常,您的代码将以更细粒度的级别访问数据。事实上,看看您的规则,我希望您的代码运行查询或访问CollectionOne和CollectionTwo的各个子节点。如果这是您的应用程序代码所做的,那么您的安全规则应该允许的也是所有。
因此,更好的一步是:
{
"rules": {
".write": "(auth != null) && (auth.uid == '123...myUID ...xyz')",
"CollectionOne": {
".read": true,
".indexOn": ["name", "url"]
},
"CollectionTwo": {
".read": true,
".indexOn": ["name"]
}
}
}现在我展示的URL模式将不再有效,恶意用户必须知道顶级节点的名称才能访问其中的数据。
有关此问题的更多信息,请参见:
https://stackoverflow.com/questions/69612460
复制相似问题