转到控制台

消除不安全因素

如果您收到有关您的 Firebase 实时数据库不安全的提醒,则可以通过修改和测试实时数据库规则来消除这些不安全因素。请阅读本指南,检查您的实时数据库规则,了解潜在的不安全因素,并测试和部署相应更改措施。

查看您的实时数据库规则

要查看您现有的实时数据库规则,请转到 Firebase 控制台中的“规则”标签页

了解您的实时数据库规则

实时数据库规则挡在您的数据与恶意用户之间。虽然在开发伊始我们一般会采用开放规则,允许所有用户对数据进行读写,但在部署应用之前,请务必配置相关规则以保护您的数据。在配置规则时,请使用模拟器对不同规则进行测试。

如果您不熟悉实时数据库规则,请参阅数据库规则使用入门详细了解它们的工作原理。

消除常见的不安全因素

您可能已经设置了默认的实时数据库规则,或者在刚开始使用实时数据库开发应用时设置了实时数据库规则,但这些规则对您已部署的应用来说可能并不是最合适的。请查看以下常见误区以及可能的解决方法。

开放式访问

在开发期间,您在设置实时数据库时可能已将规则设置为允许公众访问。如果您是唯一一名可以访问数据库的用户,那么这种规则可能没太大问题;但如果您已部署应用且不对用户进行身份验证,那么您的数据会很容易受到恶意用户的攻击。

不推荐:对所有用户授予读写权限

{
  "rules": {
    ".read": true,
    ".write": true
  }
}
解决方案:使用规则限制读写权限 构建适合您的数据层次结构的规则。针对这种危险因素的一种常见解决方案是,使用 Firebase 身份验证实现基于用户的安全控制。要了解详情,请参阅基于用户的安全性一文。

为通过身份验证的用户提供访问权限

有时,实时数据库规则会检查用户是否已登录,而不会再通过身份验证进一步限制访问权限。如果您的某一条规则包含 auth !== null,请确认您是否是想让所有已登录的用户有权访问数据。

不推荐:任何已登录用户都有权读写您的整个数据库

{
  "rules": {
      // any logged-in user access your data
      ".read": "auth !== null",
      ".write": "auth !== null"
   }
}
解决方案:使用 auth 变量缩小访问权限范围。在检查身份验证时,您可能还希望使用其中某个身份验证属性来进一步限制特定用户对特定数据集的访问权限。要详细了解 auth 变量,请参阅基于用户的安全性一文。

不当继承的规则

实时数据库规则会进行级联,即用较浅层的父路径上的规则替换较深层的子节点上的规则。在子节点上编写规则时,请注意它只能授予额外的特权。您无法在数据库的较深层路径中细化或撤消数据访问权限。

不推荐:在子路径上细化规则

{
  "rules": {
     "foo": {
        // allows read to /foo/*
        ".read": "data.child('baz').val() === true",
        "bar": {
          /* ignored, since read was allowed already */
          ".read": false
        }
     }
  }
}
解决方案:在宽泛的父路径上编写规则,并在子路径上授予更具体的特权 如果您需要更具体地控制数据访问权限,请提供细化规则。详细了解如何级联实时数据库规则,请参阅保护您的数据

关闭访问权限

在开发应用时,另一种常见方法是封锁数据库。通常,这意味着您已关闭所有用户的读写权限,如下所示:

{
  "rules": {
    ".read": false,
    ".write": false
  }
}

虽然此方法是安全的,但它也可能会导致您在启动应用时遇到问题。详细了解如何配置和部署实时数据库规则

测试您的实时数据库规则

要测试已更新的 Firebase 实时数据库规则,请使用 Firebase 控制台中的“模拟器”工具。

  1. 要打开模拟器,请点击“规则”标签页中的模拟器
  2. 在“模拟器”设置中,选择用于测试的选项,包括:
    • 测试读取或写入
    • 数据库中的特定位置(以路径表示)
    • 身份验证类型 - 未经身份验证、经过身份验证的匿名用户或特定用户 ID
  3. 点击运行,然后在规则窗口上方的横幅中查看结果。