Fra*_*len 6 firebase-security firebase-realtime-database
我在 Firebase 上创建了一个新项目,并在其中创建了一个实时数据库。当被问及我的数据库的安全规则时,我选择了Start in test mode。
现在 Firebase 控制台中我的数据库的安全规则显示为:
{
"rules": {
".read": "now < 1622790000000", // 2021-6-4
".write": "now < 1622790000000", // 2021-6-4
}
}
Run Code Online (Sandbox Code Playgroud)
这些规则意味着什么?我怎样才能改变它们以使其更安全?
自从我创建 Firebase 实时数据库以来已经一个月了,我现在收到一条消息:
除非您更新安全规则,否则您项目的实时数据库“”将开始拒绝客户端请求
Fra*_*len 10
这些默认测试模式规则是一个简单的包罗万象的规则,允许世界上的每个人在给定日期之前读取和写入您的数据库。
让我们分解规则来看看它们到底是如何工作的:
紧接其下的".read"和".write"节点"rules"决定谁可以读取/写入整个数据库中的数据。
Firebase 自动将该now变量设置为服务器上的当前时间。该值以自 epoch 以来的毫秒为单位,这是在 Firebase 中存储时间戳的建议值。
规则中的值1622790000000是未来某个时刻的时间戳。让我们看看这个值在更易读的日期格式中是多少:
console.log(new Date(1622790000000))
Run Code Online (Sandbox Code Playgroud)
“2021-06-04T07:00:00.000Z”
因此,在 2021 年 6 月 4 日之前,任何人都可以读取或写入我们数据库中的所有数据。在此日期之后,任何人都无法再使用客户端 SDK 访问数据。Firebase Admin SDK完全绕过这些规则,因此不受影响。
您可能从 Firebase 收到了这样的消息:
您选择在测试模式下开始开发,这使您的实时数据库实例完全向 Internet 开放。由于此选择会使您的应用程序容易受到攻击,因此您的数据库安全规则被配置为在前 30 天后停止允许请求。5 天内,对实时数据库实例的所有客户端请求都将被拒绝。
此消息意味着由于安全规则中的时间戳,对您的数据的访问即将过期。
实际上,将测试模式延长到另一个截止日期非常容易。您所需要做的就是更改该1622790000000值。例如,要将其延长到 7 月 4 日,我可以将该值设置为1625382000000。
为了确定要使用的值,我运行这个小 JavaScript 片段:
console.log(new Date("2021-07-04T07:00:00.000Z").getTime())Run Code Online (Sandbox Code Playgroud)
运行此代码片段以获取从现在开始一个月后的时间戳:
console.log(new Date(Date.now()+30*24*60*60*1000).getTime())Run Code Online (Sandbox Code Playgroud)
这是计算这些值的另一个工具。
通过使用,1625382000000我们将测试模式延长了一个月,每个人都可以读/写整个数据库,直到 2021 年 7 月 4 日。
在某些时候,您应该想出一种更好的方法来保护您(用户)的数据,而不仅仅是在特定日期之前打开数据。我通常在开始一个项目时就这样做,但如果你晚一点开始也没关系。
重要的是,您应该像对待应用程序的客户端源代码一样对待服务器端安全规则。
我同时开发我的代码和规则。所以:
我从完全封闭的数据库开始,因为还没有需要访问任何数据的代码。
我手动将一些数据添加到数据库中,并编写代码来读取它。此时,我编写了仅允许对该特定数据进行读取访问的安全规则。可能是这样".read": true,但它在我的 JSON 结构中会更深。即使如此简单的规则也已经可以阻止许多不良行为者。
我第一次希望应用程序写入数据库也是在我添加身份验证时。通常我从匿名身份验证开始,因为它不需要我输入任何凭据。
然后,我将硬编码的 UID 包含在我的安全规则中,以确保只有我可以写入数据。".write": "auth.uid === 'hardcodedUidOfPufsAnonymousUser'"在我添加适当的数据所有权之后,您通常仍然会在我的规则中找到这个顶层。
使用 Firestore 时,我有时会对此进行改进,如下所述:对管理员和普通用户使用相同的身份验证方法时出现用户冲突 | Firebase 身份验证
在任何时候,当我添加数据(通常是数据列表)时,我都会思考谁“拥有”这些数据以及谁可以读取它。然后我扩展我的规则以允许这种访问,仅此而已。
当我编写代码时需要更新我的安全规则,这会减慢我编码的速度,但无论如何我很乐意这样做。在每一步都保持数据库中数据的安全,使我能够让人们放心地访问应用程序/数据库。我建议你也这样做。
欲了解更多信息,我建议阅读:
| 归档时间: |
|
| 查看次数: |
2132 次 |
| 最近记录: |