有人可以向我解释一下,当我可以在客户端代码中编写规则时,为什么我们需要 Firebase 安全规则?

Ris*_*All 5 javascript firebase firebase-security google-cloud-firestore

我不知道我的问题是否接近我应该在堆栈溢出问题上提出的问题,但如果是的话......

为什么我们需要在“Firebase“规则””中编写安全规则,而我实际上可以直接进入我的客户端代码并说:

db.collection("users").get().then(res=> {
  res.docs.map(user => {
     if (user.data().uid !== auth.currentUser.uid) {
        // do something I'm about to put in this code snippet
     }
  })
})
Run Code Online (Sandbox Code Playgroud)

比如,有人可以进入我的客户端代码并编写他们想要的任何内容,这就是为什么我们需要在 Firebase 控制台内的安全规则中编写代码?

这也让我感到困惑,为什么我们需要 Firebase 函数,因为我们可以简单地在客户端执行逻辑,尽管我可以理解一些事情需要在服务器端完成。

但就这个问题的范围而言,有人可以清楚地向我解释为什么我们不能只在代码中编写安全性以使事情正常工作吗?

希望我对这些信息了解得很透彻。谢谢。

Dha*_*raj 3

Firebase 还有一个REST API,允许任何人直接向您的 Firebase 服务发出请求,而无需使用您的任何代码。因此,即使无法进行逆向工程和修改代码,也可以使用 REST API。

您不得信任客户端应用程序(尤其是 Web 应用程序),并始终验证传入数据并确保只有授权用户才能修改它。


他们如何获取对我的数据库进行 API 调用所需的信息?他们不需要钥匙吗?

如果您检查 Firebase 配置,它包含一个 API 密钥,该密钥仅用于识别您的 Firebase 项目,并且该密钥可见不存在任何风险。

现在,互联网上的任何人都知道您的数据库地址,如果您没有设置任何安全规则,他们就可以将其与 REST API 一起使用。


请注意,运行db.collection("users").get()查询后,所有文档均已从 Firestore 获取(并且数据应在网络选项卡中可见),然后您只需循环所有文档即可找到与当前用户的 UID 匹配的文档。

这个没有安全规则的查询是不安全的(除非列出用户是您的应用程序的一个功能):

db.collection("users").get().then(res => {
  const user res.docs.find(user => user.data().uid === auth.currentUser.uid)
})
Run Code Online (Sandbox Code Playgroud)

相反,您应该使用查询或访问用户特定的文档,并具有如下所示的安全规则,以确保用户只能读取/写入自己的数据:

db.collection("users").doc(auth.currentUser.uid).get().then(res => {
  console.log("user:", res.data())
})
Run Code Online (Sandbox Code Playgroud)
db.collection("users").get().then(res => {
  const user res.docs.find(user => user.data().uid === auth.currentUser.uid)
})
Run Code Online (Sandbox Code Playgroud)

  • @RiskItAll 是的。我所说的 API 密钥是指 Firebase 配置中对公众可见的 API 密钥。 (2认同)