实时数据库从不安全规则到安全规则而不中断服务

Posted

技术标签:

【中文标题】实时数据库从不安全规则到安全规则而不中断服务【英文标题】:Realtime Database from insecure to secure rules without interrupting services 【发布时间】:2021-12-25 20:09:48 【问题描述】:

今天,我收到一封电子邮件,其中说,

[Firebase] 您的实时数据库“CC-default-rtdb”的规则不安全,任何用户都可以读取您的整个数据库,任何用户都可以写入您的整个数据库

我的服务器每天都会运行以将值存储在实时数据库中。当我开始这个 Firebase 项目时,我使用了基本的读写规则。


  "rules": 
    ".read": true,
    ".write": true
  

如果我现在更改规则,是否会影响我的外部 Node.JS 服务器将值存储到实时数据库中?

我什至从移动应用程序访问这个数据库,如果规则改变,它会影响移动应用程序读取数据吗?

如何在不中断对外部服务器和移动应用程序的访问的情况下保护这些 Realtime DB 规则(从公共到私有)?重要的是,我的外部服务器访问不得中断。

【问题讨论】:

欢迎来到 ***! Admin SDK 将忽略您的安全规则,因为它们具有对您的数据库的直接读/写访问权限(除非您另外指定)。如果用户在没有登录的情况下访问您的数据库(例如,您的应用程序直接连接),则必须适当设置您的规则以处理匿名访问。我建议看看this answer、this question 以及documentation。 非常感谢!!!!! 【参考方案1】:

如果您通过身份验证(登录)访问您的数据库,您可以将您的节点设置为auth!=null,这样任何未经授权的用户都无法访问它们。

您需要遵循以下步骤:

    将需要公开的所有节点的读取设置为 true 将所有节点的读/写设置为auth!=null,以供任何授权用户使用 为任何需要特殊访问的节点设置自定义验证规则(例如:用户只能写入他/她的数据)

根据屏幕截图,如果有人掌握了您的项目 ID,他们就可以修改和窃取您的整个数据库。

您需要以正确匹配您的用例的方式设置规则。据我了解:

允许外部服务器帐户访问整个数据库 允许移动应用有条件的访问(也许是用户?)

示例

以这个数据库为例:


  "top_level": 
    "users": [
      
        "username": "X",
        "userId": "0"
      ,
      
        "username": "Y",
        "userId": "1"
      
    ],
    "public_data": 
      "news": [
        
          "title": "X",
          "body": "Y"
        
      ]
    
  

我要设置:

节点“新闻”可供公开阅读(无身份验证) 节点“users”仅供其他登录用户阅读(auth) 节点“users”的子节点只能对 id 与节点中的值 userId 匹配的用户可写

在这种情况下,规则是:


  "rules": 
    ".read": false,
    ".write": false,
    "top_level": 
      "users": 
        ".read": "auth!=null", 
        "$user_id": 
          ".write": "auth!=null && data.child('userId').val()===auth.uid"
        
      ,
        "news" : 
          ".read":true
        
    
  

注意,在顶层设置为 true 的规则会覆盖内部规则。 如果您需要澄清,请发表评论。

【讨论】:

我建议用一些例子扩展这个答案(因为新用户可能不明白你在这种情况下所说的“节点”是什么意思)。虽然“修改和窃取您的整个数据库”是一个正确的观点 - 任何人都可以彻底删除整个数据库这一事实是当前规则的更大威胁。 好的,我会尝试为我提到的步骤添加一个示例

以上是关于实时数据库从不安全规则到安全规则而不中断服务的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 实时数据库安全规则允许更新但未设置

Firebase 实时电话数据库安全规则

Firebase 实时数据库,安全规则 - 检查其他节点

如何为实时数据库设置安全规则,但允许注册新用户并创建哈希图?

我们如何为 Firebase 存储编写依赖于 Firebase 实时数据库中的值的安全规则? [复制]

云原生及其内生安全规则