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
这些默认测试模式规则是一个简单的包罗万象的规则,允许世界上的每个人在给定日期之前读取和写入您的数据库。
让我们分解规则来看看它们到底是如何工作的:
The ".read"
and ".write"
紧接其下的节点"rules"
确定谁可以读/写整个数据库中的数据。
The now多变的 Firebase 自动将其设置为服务器上的当前时间。该值位于自纪元以来的毫秒数 ,这是在 Firebase 中存储时间戳的建议值。
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 日。
如何更好地保护数据?
在某些时候,您应该想出一种更好的方法来保护您的(用户)数据,而不仅仅是在特定日期之前打开数据。我通常在开始一个项目时就这样做,但如果你晚一点开始也没关系。
重要的是你应该将服务器端安全规则视为与应用程序的客户端源代码相同 .
我同时开发我的代码和规则。所以:
我从完全封闭的数据库开始,因为还没有需要访问任何数据的代码。
我手动将一些数据添加到数据库中,并编写代码来读取它。此时,我编写了仅允许对该特定数据进行读取访问的安全规则。所以可能是".read": true
,但它在我的 JSON 结构中会更深。即使如此简单的规则也已经可以阻止许多不良行为者。
我第一次想要这个应用程序write 当我添加身份验证时也到数据库。通常我从匿名身份验证开始,因为它不需要我输入任何凭据。
然后,我将硬编码的 UID 包含在我的安全规则中,以确保只有我可以写入数据。您仍然经常会发现这个顶级".write": "auth.uid === 'hardcodedUidOfPufsAnonymousUser'"
很久以后,在我添加了适当的数据所有权之后,才在我的规则中。
使用 Firestore 时,我有时会对其进行改进,如下所述:管理员和普通用户使用相同的身份验证方法时出现用户冲突 | Firebase 身份验证
在任何时候,当我添加数据(通常是数据列表)时,我都会思考谁“拥有”这些数据以及谁可以读取它。然后我扩展我的规则以允许这种访问,仅此而已。
当我编写代码时需要更新我的安全规则,这会减慢我编码的速度,但无论如何我很乐意这样做。在每一步都保持数据库中数据的安全,使我能够让人们放心地访问应用程序/数据库。我建议你也这样做。
欲了解更多信息,我建议阅读:
Firebase 文档安全规则 ,其中包含这些常见用例的示例:
仅限内容所有者访问
公共读,私有写访问
基于属性和角色的访问
所有经过身份验证的用户 可以读/写所有数据
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)