【问题标题】:Can someone please explain to me why we need Firebase security rules when I can literally write rules in my client code?当我可以在客户端代码中逐字编写规则时,有人可以向我解释为什么我们需要 Firebase 安全规则吗?
【发布时间】:2022-01-07 16:45:38
【问题描述】:

我不知道我的问题是否在我应该在堆栈溢出时提出的问题附近,但如果是这样......

当我可以直接进入我的客户端代码并说:

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 函数,尽管我可以理解有些事情需要在服务器端完成。

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

希望我对信息很全面。谢谢。

【问题讨论】:

  • 无需浏览器即可调用api。我一直在使用进行 curl 调用的 GUI 来测试我的应用程序。在客户端,我可以添加一个断点并将一个变量更改为绕过安全检查的任何内容。
  • 您在客户端公开的任何内容都可以在客户端外部访问。服务器规则会阻止我编写自己的客户端,它只是绕过所有前端安全检查。
  • 他们如何获得对我的数据库进行 API 调用所需的信息?他们不需要钥匙吗?这是我的困惑程度。还是只是以防万一他们掌握了这些信息?
  • 浏览器上运行的任何东西都应该被认为是不可信的。用户控制着浏览器,而不是你,所以浏览器没有秘密。
  • 因为您无法信任客户端永远

标签: javascript firebase google-cloud-firestore firebase-security


【解决方案1】:

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

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

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

【讨论】:

  • 好的,所以基本上你的意思是,如果你有我的 API,你现在可以从你所在的地方读取和写入我的整个数据库,甚至不需要登录我的项目密钥,我设置了 0 个安全规则。对吗?
  • @RiskItAll 是的。通过 API 密钥,我指的是 Firebase 配置中对公众可见的那个。
  • 好的,我还有一分钟时间将您的答案标记为 1。但是就在我引起你注意的时候,这也是我们需要 Firestore 功能的原因吗?例如,如果不在服务器上执行,将您想要发生的事情(例如调整大小和图像或其他副作用)的逻辑放在危险之中?
  • @RiskItAll 在云函数或服务器等安全环境中运行您的逻辑可以帮助您确保请求用户已获得授权,因为没有人可以更改其中的代码,他们只是无法删除授权限制。这正是安全规则所做的。如果您添加一个用户只能读取自己的数据的规则,他们将无法获取其他人的数据,因为他们无法逆向工程或修改安全规则。
  • "如果您添加一个用户只能读取自己的数据的规则,他们将无法获取其他人的数据,因为他们无法逆向工程或修改安全规则" - 这刚刚做了它为我点击!谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-02-28
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多