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

Can someone please explain to me why we need Firebase security rules when I can literally write rules in my client code?

我不知道我的问题是否在我应该在堆栈溢出时询问的范围之内,但如果是的话...

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

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
     }
  })
})

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

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

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

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

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

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


How would they get the information needed to make API calls to my database though? And wouldn't they need a key?

如果您检查 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)
})

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

db.collection("users").doc(auth.currentUser.uid).get().then(res => {
  console.log("user:", res.data())
})
// Security rules
match /users/{userId} {
  allow read, write: if request.auth.uid === userId;
}