Firebase 实时数据库的这些默认安全规则意味着什么?

2023-12-12

I've created a new project on Firebase, and created a Realtime Database in there. When asked about the security rules for my database, I selected to Start in test mode.

现在 Firebase 控制台中我的数据库的安全规则显示为:

{
  "rules": {
    ".read": "now < 1622790000000",  // 2021-6-4
    ".write": "now < 1622790000000",  // 2021-6-4
  }
}

这些规则意味着什么?我怎样才能改变它们以使其更安全?


距离我创建 Firebase 实时数据库已有一个月了,我现在收到一条消息:

除非您更新安全规则,否则您项目的实时数据库“”将开始拒绝客户端请求


Answer recommended by Google Cloud Collective

这些默认测试模式规则是一个简单的包罗万象的规则,允许世界上的每个人在给定日期之前读取和写入您的数据库。

让我们分解规则来看看它们到底是如何工作的:

  1. The ".read" and ".write"紧接其下的节点"rules"确定谁可以读/写整个数据库中的数据。

  2. The now多变的Firebase 自动将其设置为服务器上的当前时间。该值位于自纪元以来的毫秒数,这是在 Firebase 中存储时间戳的建议值。

  3. The 1622790000000规则中的值是未来某个时刻的时间戳。让我们看看这个值在更易读的日期格式中是多少:

       console.log(new Date(1622790000000))
    
      

    “2021-06-04T07:00:00.000Z”

因此,在 2021 年 6 月 4 日之前,任何人都可以读取或写入我们数据库中的所有数据。在此日期之后,任何人都无法再通过客户端 SDK 访问数据。这Firebase 管理 SDK完全绕过这些规则,因此它们不受影响。


我可以延长期限吗?

您可能从 Firebase 收到了这样的消息:

您选择在测试模式下开始开发,这使您的实时数据库实例完全向 Internet 开放。由于此选择会使您的应用程序容易受到攻击,因此您的数据库安全规则被配置为在前 30 天后停止允许请求。 5 天内,对实时数据库实例的所有客户端请求都将被拒绝。

此消息意味着由于安全规则中的时间戳,对您的数据的访问即将过期。

实际上,将测试模式延长到另一个截止日期非常容易。你需要做的就是改变这一点1622790000000价值。例如,要将其延长到 7 月 4 日,我可以将该值设置为1625382000000.

为了确定要使用的值,我运行这个小 JavaScript 片段:

   console.log(new Date("2021-07-04T07:00:00.000Z").getTime())

运行此代码片段以获取从现在开始一个月后的时间戳:

   console.log(new Date(Date.now()+30*24*60*60*1000).getTime())

这是另一个tool来计算这些值。

通过使用1625382000000我们将测试模式延长了一个月,每个人都可以读/写整个数据库,直到 2021 年 7 月 4 日。


如何更好地保护数据?

在某些时候,您应该想出一种更好的方法来保护您的(用户)数据,而不仅仅是在特定日期之前打开数据。我通常在开始一个项目时就这样做,但如果你晚一点开始也没关系。

重要的是你应该将服务器端安全规则视为与应用程序的客户端源代码相同.

我同时开发我的代码和规则。所以:

  1. 我从完全封闭的数据库开始,因为还没有需要访问任何数据的代码。

  2. 我手动将一些数据添加到数据库中,并编写代码来读取它。此时,我编写了仅允许对该特定数据进行读取访问的安全规则。所以可能是".read": true,但它在我的 JSON 结构中会更深。即使如此简单的规则也已经可以阻止许多不良行为者。

  3. 我第一次想要这个应用程序write当我添加身份验证时也到数据库。通常我从匿名身份验证开始,因为它不需要我输入任何凭据。

    然后,我将硬编码的 UID 包含在我的安全规则中,以确保只有我可以写入数据。您仍然经常会发现这个顶级".write": "auth.uid === 'hardcodedUidOfPufsAnonymousUser'"很久以后,在我添加了适当的数据所有权之后,才在我的规则中。

    使用 Firestore 时,我有时会对其进行改进,如下所述:管理员和普通用户使用相同的身份验证方法时出现用户冲突 | Firebase 身份验证

  4. 在任何时候,当我添加数据(通常是数据列表)时,我都会思考谁“拥有”这些数据以及谁可以读取它。然后我扩展我的规则以允许这种访问,仅此而已。

当我编写代码时需要更新我的安全规则,这会减慢我编码的速度,但无论如何我很乐意这样做。在每一步都保持数据库中数据的安全,使我能够让人们放心地访问应用程序/数据库。我建议你也这样做。

欲了解更多信息,我建议阅读:

  • Firebase 文档安全规则,其中包含这些常见用例的示例:
  • 仅限内容所有者访问
  • 公共读,私有写访问
  • 基于属性和角色的访问
  • 所有经过身份验证的用户可以读/写所有数据
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firebase 实时数据库的这些默认安全规则意味着什么? 的相关文章

随机推荐

  • 如何使用 PyQt 在按钮单击时调用 python 脚本

    我使用 PyQt4 创建了一个带有按钮的表单 在此按钮上 我想调用另一个 python 脚本 如下所示 文件1 py import sys from PyQt4 import QtCore QtGui from file1 ui impor
  • Google App Script URLFetch 配额不清楚

    我有兴趣构建一个依赖外部服务的电子表格插件 并且 URLFetch 似乎是使用应用程序脚本执行远程 HTTP S 调用的唯一方法 我已经达到了应用脚本配额页面检查限制 我可以看到它们是 GSuite 计划每天 100 000 个呼叫 Gma
  • 使用正则表达式检测以带重音的大写字母开头的单词

    我想使用 Java 中的正则表达式提取以大写字母开头的单词 包括重音大写字母 这是我对以大写 A 到 Z 开头的单词的条件 if link text matches A Z true 但我也想要以 a 开头的单词accented也是大写字符
  • MASM32 中令人困惑的括号

    我正在尝试掌握 MASM32 但对以下内容感到困惑 我认为括号用于间接寻址 所以如果我有预定义的变量 data item dd 42 then mov ebx item 会将 item 的内容 即数字 42 放入 ebx 中并 mov eb
  • 如何在 MVC Razor 中显示 TimeSpan

    所以我有一个视频的持续时间 以秒为单位 我想在 Razor 中显示该持续时间 目前我正在使用 TimeSpan FromSeconds item Duration ToString 然而我正在使用的其余代码使用 Html DisplayFo
  • angularjs firebase onAuthStateChanged 注销数据库错误

    当我退出应用程序时 出现以下错误 Error permission denied at users KuehJHDJ15SfS1s6FIh1 Client doesn t have permission to access the desi
  • SSLPeerUnverifiedException 与 httpClient

    我正在尝试使用自签名证书测试安全的 http 连接 仅用于开发目的 但我无法解决对等未验证异常 当然我已经查看了有关此异常的类似帖子 以下是我正在使用的当前实现 public class SelfCertificatesSocketFact
  • 来自 pynput 的键盘监听器

    我正在尝试将键盘侦听器导入到我的班级中 但不断收到 NameError name on press is not defined 这是我的代码 from pynput import keyboard class game code with
  • 如何正确裁剪 iPhone 4G 拍摄的图像(带有 EXIF 旋转数据)?

    Folks 我一直在尝试让这段代码处理 iPhone 4G 上相机拍摄的图像 但没有成功 iPhone CGImageCreateWithImageInRect 旋转一些相机胶卷图片 此代码非常适合裁剪 正常 图像 我从互联网下载的图像或由
  • 未找到目标,请重新连接设备,Xcode:设备支持文件

    升级 Xcode 后 我无法在 Xcode 上运行我的 iPhone 我的 Xcode 等待啊等待终于给出了这样的错误并且卡住了 即使我拔掉了 USB 电缆并删除了派生数据 也没有任何变化 我在将 Xcode 升级到 12 0 12 1 和
  • Python:使用 vars() 将字符串分配给变量

    我发现能够在运行时创建新变量并创建结果字典以供稍后处理 即写入文件 非常有用 myDict for i in range 1 10 temp variable str i vars temp myFunctionThatReturnsDat
  • Slf4j LoggerFactory.getLogger 和 sonarqube

    初始化 Slf4j LoggerFactory getLogger 的正确方法是什么 我的代码中有 static final Logger logger LoggerFactory getLogger MyClass class 但 son
  • 创建 JavaScript 小部件时如何管理浏览器“后退”和“前进”按钮

    我创建了一个 Javascript 小部件 允许用户在外部网站上嵌入日历 现在我没有以任何方式处理浏览器后退 前进按钮 这意味着如果他们点击一个事件 它会通过ajax加载 但是如果他们点击 后退 他们就会被带到以前的网站 我看到两个解决方案
  • 使用vbscript读取/保存网页

    目标 登录网页 并将 html 保存到文件中以供稍后解析 页面上的 html 只是用户列表以及他们登录和注销的时间 当您加载网页时 会弹出一个 JavaScript 框并要求输入登录信息 我可以用 SendKeys 填充它 但我真的想在不弹
  • C# 字符串字符替换

    我有一个字符串 其中倒数第三个字符有时是 如果是这种情况 我想将其替换为 该字符串还可以有其他 贯穿始终 有一个优雅的解决方案吗 编辑 感谢大家的回答 只是为了澄清一下 是的 倒数第三个我的意思是以下形式的字符串xxxxxx xx 这是欧洲
  • 尝试在闪亮的 R 应用程序顶部添加一个框来容纳简短的描述和徽标

    我正在尝试在顶部闪亮的 R 应用程序中添加一个框 以容纳简短的描述和徽标 我一直找不到任何有效的代码 我的想法是包含一个水平框并将徽标的一些文本 图像传递到其中 但尚未找到任何解决方案 任何帮助表示赞赏 下面是一些结构代码 header l
  • Android SD 卡创建的文件不可见

    我使用以下代码在 SD 卡中创建了一个文件 File outputFile new File Environment getExternalStorageDirectory getAbsolutePath File separator te
  • 类型“xxx”在未引用的程序集中定义

    我一直在互联网上寻找有关此问题的答案 并且确实可以使用帮助 我已经看过有关此错误的其他帖子 但这些答案都没有帮助我 完整的错误是 类型 xxx 是在未引用的程序集中定义的 您必须添加对程序集 xxx Version 0 0 0 0 Cult
  • 具有原始值的枚举

    为什么我不能用这样的原始值定义枚举 enum Edges Double Double case TopLeft 0 0 0 0 case TopRight 1 0 0 0 case BottomLeft 0 0 1 0 case Botto
  • Firebase 实时数据库的这些默认安全规则意味着什么?

    I ve created a new project on Firebase and created a Realtime Database in there When asked about the security rules for