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

时间:2021-04-28 02:20:24

标签: firebase firebase-realtime-database google-cloud-firestore google-cloud-functions

我正在实施一个使用 Google Firebase Cloud Firestore 的应用程序。因为我的应用有很多小的写请求,如果我在中间使用 Firebase Cloud Functions 会非常昂贵。因此,我在 Should we allow users to write to database directly 上提出了一个问题。所有的回应都说我不应该这样做。那么,为什么 Google Firebase Cloud Firestore 有“写入”、“更新”安全规则?无论如何,用户不应写入数据库。

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

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

2 个答案:

答案 0 :(得分:1)

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

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

SE 中列出的问题来自那些不知道您可以在规则和项目中放置的限制和限制,以控制 Firebase 和您的应用可以请求的内容。

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

答案 1 :(得分:1)

对于多次写入,实时是理想的选择,因为与 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-firebase-realtime-database-rule-templates-d4894a118a98

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