【问题标题】:Firebase Realtime DB how to silence warnings?Firebase Realtime DB 如何消除警告?
【发布时间】:2021-11-29 18:55:44
【问题描述】:

我正在使用实时数据库ONLY实时统计在线/活跃用户。

简单的数据库结构实际上是这样的:

"user-states": {
    "user-id-1": 1,
    "user-id-2": 2,
    ....
}

我目前的规则:

{
  "rules": {
    ".read": "auth.uid != null",
    ".write": "newData.exists() && auth.uid != null",
  }
}

对于上面给出的最简单的数据库结构,我想不出更好的规则。如果 Firebase 项目出现漏洞,对整个系统来说是没有问题的。删除或更改数据,没问题,因为它是实时更新的。

如果我使上述规则正确,那么是否可以只关闭有关“不安全”规则的警告电子邮件?

【问题讨论】:

标签: firebase firebase-realtime-database


【解决方案1】:

虽然您当前的规则发挥了作用,但它们并不能保护您的数据库免受滥用,这就是它们被标记为不安全并且您会收到警报的原因。这些警报很重要,不应在没有充分理由的情况下忽略。正如@pufcomments below 中提到的那样,可以禁用这些警报,但我不建议您将其用于您的应用程序。

作为攻击向量的一些示例,您可以使用当前结构执行以下操作:

  • 清空 /user-states 并填充垃圾 - 这可能会破坏您的客户端逻辑
  • 将用户状态更改为意外状态(例如,非数字、无效枚举值) - 这可能会破坏您的客户端逻辑
  • 未经许可更改其他用户的状态
  • 将兆字节的数据写入数据库 - 这可能会破坏您的客户端逻辑

由于您的结构似乎是/user-states/$uid = <numeric status>,因此您至少可以tighten your rules 相应地:

{
  "rules": {
    "user-states": {
      // any signed-in user may read states
      ".read": "auth.uid != null",

      "$uid": {
        // only the concerned user may update their own state
        ".write": "newData.exists() && auth.uid == $uid",
    
        // state must be numeric
        ".validate": "newData.isNumber()"
      }
    }
  }
}

如果这些限制性太强,您也可以使用比原来的规则稍微好一点的以下规则:

{
  "rules": {
    "user-states": {
      // any signed-in user may read states
      ".read": "auth.uid != null",
    
      // any signed-in user may update the state of another user
      ".write": "newData.exists() && auth.uid != null",
    
      "$uid": {
        // state must be numeric
        ".validate": "newData.isNumber()"
      }
    }
  }
}

注意:您可以进一步将新状态值限制为少数几个值,而不仅仅是“是一个数字”。

【讨论】:

  • "这些警报很重要,无法禁用它们" 可以从 Firebase 控制台禁用警报,方法是单击右上角的铃铛图标 (?),然后单击设置图标 (⚙️ ) 从那里,然后选择有问题的项目。另见stackoverflow.com/questions/55388991/…
猜你喜欢
  • 2016-12-04
  • 2014-01-18
  • 2021-11-13
  • 2018-06-25
  • 2022-01-03
  • 1970-01-01
  • 2021-01-16
  • 2022-01-21
  • 1970-01-01
相关资源
最近更新 更多