如何限制 Firebase 数据修改?

Posted

技术标签:

【中文标题】如何限制 Firebase 数据修改?【英文标题】:How to restrict Firebase data modification? 【发布时间】:2016-05-26 21:08:57 【问题描述】:

Firebase 提供数据库后端,以便开发人员可以专注于客户端代码。

因此,如果有人使用我的 firebase uri(例如,https://firebaseinstance.firebaseio.com)然后本地开发它。

那么,他们能否从我的 Firebase 实例中创建另一个应用,注册并验证自己以读取我的 Firebase 应用的所有数据?

【问题讨论】:

【参考方案1】:

@Frank van Puffelen,

您提到了网络钓鱼攻击。实际上有一种方法可以保证这一点。

如果您登录到您的 googleAPIs API Manager 控制台,您可以选择锁定您的应用将接受来自哪个 HTTP 引荐来源网址的请求。

    访问https://console.developers.google.com/apis 转到您的 Firebase 项目 转到凭据 在 API 密钥下,选择与您的 Firebase 项目关联的浏览器密钥(应该与您用于初始化 Firebase 应用的 API 密钥具有相同的密钥。) 在“接受来自这些 HTTP 引荐来源网址(网站)的请求下,只需添加您的应用的 URL。

这应该只允许列入白名单的域使用您的应用。

这也在此处的 firebase 启动清单中进行了描述:https://firebase.google.com/support/guides/launch-checklist

也许 firebase 文档可以使其更加可见或默认自动锁定域并要求用户允许访问?

【讨论】:

当我进入 Google API 控制台时,我没有看到锁定 HTTP 引荐来源网址的选项。屏幕截图会有所帮助。谢谢 您是否尝试过按照上述步骤操作?它应该带你到那里。出于安全原因,我不打算截屏。请记住查找浏览器密钥。祝你好运。 如果将 firebase 与混合移动应用程序一起使用,使用像 ionic 这样的框架,白名单如何工作?有什么建议吗? @prufrofro 这对你来说还好吗?正在考虑为 android 应用程序做同样的事情。我想知道为什么 Firebase 没有在安全部分涵盖这一点。 @Anand 是的,但 Firebase 没有在文档中介绍这一点。默认情况下,密钥是公开的,您必须手动限制它们以仅在特定包名称和 SHA-1 应用程序证书中使用。我想知道为什么 Firebase 根本没有提到这一点。有什么问题吗?【参考方案2】:

有人知道您的网址这一事实并不构成安全风险。

例如:我可以毫无问题地告诉您,我的银行在 bankofamerica.com 托管其网站,并且在那里使用 HTTP 协议。除非您还知道我用来访问该网站的凭据,否则知道 URL 对您没有任何好处。

为了保护您的数据,您的数据库应该受到以下保护:

验证规则确保所有数据都符合您想要的结构 授权规则,保证每一位数据只能被授权用户读取和修改

这在Firebase documentation on Security & Rules 中都有介绍,我强烈推荐。

有了这些安全规则,其他人的应用程序可以访问您数据库中的数据的唯一方法是,如果他们复制您的应用程序的功能,让用户登录到他们的应用程序而不是您的并登录/读取/写入您的数据库;本质上是网络钓鱼攻击。在这种情况下,数据库中没有安全问题,尽管可能是时候让一些权威机构参与进来了。


2021 年 5 月更新:借助名为 Firebase App Check 的新功能,现在实际上可以将实时数据库的访问权限限制为仅来自已注册的 ios、Android 和 Web 应用程序的访问权限在您的 Firebase 项目中。

您通常希望将此与上述基于用户身份验证的安全性结合起来,这样您就有了另一个屏障,可以防止确实使用您的应用的滥用用户。

通过将 App Check 与安全规则相结合,您既可以广泛地防止滥用,又可以很好地控制每个用户可以访问的数据。

【讨论】:

不是我正在寻找的答案。让我换个方式问你。假设我给你这个 url 到我的 firebase https://tinderclone.firebaseio.com/https://tinderclone.firebaseio.com/profiles.json。它们是真正的 firebase 数据库。你能开发一个应用程序吗,用电子邮件制作一个注册表单和登录表单。由于我的应用程序允许任何人使用电子邮件注册,所以在您注册后,您可以读取所有数据吗?稍后我会问你另一个问题。谢谢 这取决于您如何保护您的数据库。只需添加".read": false 即可防止任何人看到数据。您可能希望允许更多,但这完全取决于您的用例。 Firebase documentation on Security & Rules 中介绍了保护数据的方法。 @PunitPandey 如果您对 App Check 的配额有疑问(或者在这种情况下,您似乎指的是 SafetyNet 提供商),我建议您发布一个单独的问题,分享您的代码,以及您收到的错误消息。 @FrankvanPuffelen 我没有任何问题。我只是指出,SafetyNet 的配额限制是“每分钟最多 5 个请求”,这使得 AppCheck 对于生产用途几乎毫无用处。这是配额的详细信息 - developer.android.com/training/safetynet/… 即单个应用每分钟可以发出的请求数。 App Check 仅向 Safetynet 发出一次请求以获取令牌,该令牌有效期为一小时,因此您不应超出此配额。但是当然,错误总是可能的,所以如果您遇到问题,我建议您发布一个新问题,其中包含有关该问题的详细信息。【参考方案3】:

关于移动应用的Auth白名单,在域名不适用的情况下,Firebase有

    SHA1 fingerprint 用于Android 应用

    App Store ID and Bundle ID and Team ID (if necessary) 用于您的 iOS 应用

您必须在 Firebase 控制台中进行配置。

有了这种保护,因为验证不仅是验证某人是否拥有有效的 API 密钥、身份验证域等,还验证它是否来自我们的授权应用程序和 Webdomain name/HTTP referrer in case

也就是说,如果这些 API 密钥和其他连接参数暴露给其他人,我们不必担心。

欲了解更多信息,https://firebase.google.com/support/guides/launch-checklist

【讨论】:

原谅我的无知,我对加密不是很好,但是Sha1不能通过你的apk访问吗?人们不能也复制Sha1吗?我不明白这有什么帮助。我很高兴被证明不是这样:) 是的。您当然可以获得 apk 的 sha1。但这不是你作为参数传递给 firebase 以验证你的调用的东西。它是由 firebase 在其 api-sdk 级别(相信来自 android 运行时)采取的。因此,您将无法将其作为参数发送到 firebase 以伪造连接。 仅使用 SHA1 指纹无助于保护您的 Android 应用与 Firebase 的通信。 SHA1 本身可以很容易地获取和复制,并且仍然可以通过使用 Firebase API 而不是 SDK 来伪造连接。您应该首先证明您的应用,并使用一些代码混淆来隐藏密钥。

以上是关于如何限制 Firebase 数据修改?的主要内容,如果未能解决你的问题,请参考以下文章

我该如何解决这个问题:Android Studio - Flutter - Dart - firebase [关闭]

Uncaught FirebaseError: Firebase: No Firebase App '[DEFAULT]' has been created - 在 vue.js 中调用 Fireba

Stripe 和 Firebase:FirebaseError:collection() 的第一个参数应为 CollectionReference、DocumentReference 或 Fireba

如何在 Firebase 中验证休息呼叫?

Firebase - 显示到 ListView

Firebase 大查询 - 如何从自定义事件表中检索数据