为什么Google Firebase Cloud Firestore有"写入","更新"安全规则,而我们不应该允许用户直接在数据库上写入?



我正在实现一个使用Google Firebase Cloud Firestore的应用程序。因为我的应用程序有很多小的写入请求,所以如果我在在中间使用Firebase云函数,成本会非常高。因此,我问了一个关于是否允许用户直接写入数据库的问题。所有的回复都说我不应该这么做。那么,为什么谷歌Firebase Cloud Firestore有"写入""更新";安全规则?用户无论如何都不应该写入数据库。

编辑(回应DIGI的评论和回答(:从答案来看,我们似乎可以使用firebase规则。那么,我们应该如何正确使用它们呢?

例如,我的应用程序正在记录用户打开地图时的位置;将其更新到数据库中,以便用户的朋友可以实时查看。我应该如何确保数据的格式为{longitude:double,latitude:double,timeStamp:timeStamp},并且用户不会更改文档中的任何其他数据?

这是标准MySQL数据库中常见的误解,类似于服务器充当逻辑层并位于客户端和数据库之间的情况。

Firebase在一个被称为安全规则的简化版本中仍然有这一层逻辑,它允许从客户端进行基本的读写操作。该设计是通过将计算能力从服务器后端转移到客户端,通过将需求分配到用户的设备来节省后端的服务器计算成本。

SE中列出的担忧来自于那些不知道你可以在规则和项目中设置的限制和限制的人,以控制firebase和你的应用程序可以请求什么。

需要澄清的是,Firebase不会隐藏您的数据库密钥,它们很容易访问,是的,理论上用户可以使用您的数据库后端创建客户端。但只要规则到位,定义了条件,强制执行了Cors配置和应用程序源设置,就可以防止所有这些。

对于多次写入,Realtime是理想的选择,因为它可以比Firestore写入更快、更经济高效地处理数据。因此,我的示例将根据您的编辑以实时数据库的意图进行响应。

{
“rules”: {
“location”: {
“$uid”: {
“.validate”: “newData.hasChildren(['longtitude', 'latitude', 'timestamp']) &&
newData.child('longtitude').isNumber() &&
newData.child('latitude').isNumber() &&
newData.child('timestamp').val() <= now”, 
}
}
}
}

我强烈建议熟悉的一些核心概念

https://medium.com/@juliomacr/10-防火酶-高度-数据库-规则-模板-d4894a118a98

此处提供完整文档:https://firebase.google.com/docs/reference/security/database

相关内容

  • 没有找到相关文章

最新更新