【问题标题】:Firebase authorization and security modelFirebase 授权和安全模型
【发布时间】:2021-03-22 08:20:48
【问题描述】:

我正在制作一个应用程序,它将使用 Firebase 实时数据库来分发一些数据。我认为我的要求或多或少是普遍的。

  1. 很少有使用 Java 编写的专用应用程序的客户端具有读/写访问权限。
  2. 许多移动应用程序用户具有只读权限
  3. 其他任何人都应该在读取数据时遇到问题(嗯,一些问题)
  4. 其他人应该无法读取某些部分数据
  5. 其他人应该不能写数据(这是最重要的)

3 是愿望,4 是强烈的愿望,但 5 是重要的要求。

到目前为止,我看到了完成这项任务的两种方法

  1. 向授权用户授予读写权限,例如
    "rules": {
        ".read": "auth.uid !== null",
        ".write": "auth.uid !== null"
      }

使用匿名登录自动对移动用户进行身份验证,使用任何其他 (OAuth) 身份验证对作者进行身份验证。

  1. 向任何人授予读取权限,向经过身份验证的用户授予写入权限
    "rules": {
        ".read": "true",
        ".write": "auth.uid !== null"
      }

并加密数据或其敏感部分。

在任何这些方法中,我都看到了缺点。方法 1 不好,因为任何可以破解 APK 的人都可以写入数据库——这是不可接受的。此外,Google 将为数据库创建数百或数千个匿名帐户 - 每次授权尝试一个。

方法 2 避免了这种情况,但还有另一个问题 - 任何具有良好 Internet 连接的人都可以下载所有数据,这让我不得不向 Google 支付巨额费用。每 TB 的恶意下载将花费我 1000 美元。执行此操作所需的唯一知识是数据库的 URL。在这种情况下,我将无法做任何事情,因为所有客户端都已配置为不受限制的读取访问。

我的预期是否正确,正确的解决方案是什么?

【问题讨论】:

    标签: firebase-realtime-database firebase-authentication firebase-security


    【解决方案1】:

    您的安全规则应准确反映您希望用户允许执行的操作。从这个意义上说,它们是您的应用程序代码的一部分,就像在 Android 设备上运行的 Java/Kotlin 代码一样。

    我的首选模型是在编写应用程序代码时改进我的安全规则。

    所以我最初授予任何人任何访问权限,因为我的应用程序中还没有需要访问权限的代码。

    然后,例如,当我从应用程序写入配置文件数据时,我的安全规则会拒绝该写入。我修改了我的规则,只允许新的操作,没有别的。所以:用户只能编写自己的个人资料。

    接下来,我可能希望所有已登录的用户都能阅读彼此的个人资料,因此我为此编写了代码,但再次遭到拒绝。然后,我修改了我的安全规则以允许这个特定的读取操作。

    这种方法导致安全规则授予所需的最小访问权限,而不是您尝试将安全性作为整个数据库的一个大开关来实现的方法。

    我强烈建议阅读 security rules 上的 Firebase 文档,特别是包含一些 basic use-cases 的页面,就像我上面描述的那样

    【讨论】:

    • 这是一个很好的建议,但不适用于我的情况。我正在制作更像报纸的东西,每个人都应该能够阅读它。我想隐藏部分信息,但这并不重要。在您描述的正常用例中 - 最初没有人可以做任何事情。以我的报纸为例-每个人都可以阅读所有内容。然后可能会应用一些限制。
    • 每个人都可以阅读应用程序中的所有内容这一事实并不意味着您应该在根目录上拥有".read": true。您还可以在安全规则中对代码采用的访问路径进行编码,这将大大减少您在此向量上看到的滥用情况。
    猜你喜欢
    • 2023-03-23
    • 2017-05-10
    • 2012-04-07
    • 2013-01-22
    • 1970-01-01
    • 2015-05-30
    • 2011-05-24
    • 1970-01-01
    相关资源
    最近更新 更多