Firebase阻止实时数据库的恶意更新



我正在尝试开发一个实时匿名队列与firebase实时数据库。这个概念是当一个人访问我的网页时,它将生成一个UUID并在firebase DB中插入一条记录。根据UUID的位置,我将确定该用户在队列中的位置。以下是文件的样本:-

{
_random_key_1: {
uuid: '47c044c7-da32-4e37-a416-cb2d621e0e39',
is_finished: false
},
_random_key_2: {
uuid: 'bcb8e01f-7745-43aa-9897-fd217d755769',
is_finished: false
},
_random_key_3: {
uuid: 'cdf754bd-4626-4da1-b676-9ebe87927a04',
is_finished: false
},
}

这里,队列id为cdf754bd-4626-4da1-b676-9ebe87927a04的用户的位置为3。当队列前面的人完成他的事情时,我将用is_finished: true更新他的队列对象,并重新计算连接到该DB的其他所有人的位置。

例如,假设第一个用户(47c044c7-da32-4e37-a416-cb2d621e0e39)完成了他的任务。下面是文档的外观

{
_random_key_1: {
uuid: '47c044c7-da32-4e37-a416-cb2d621e0e39',
is_finished: true
},
_random_key_2: {
uuid: 'bcb8e01f-7745-43aa-9897-fd217d755769',
is_finished: false
},
_random_key_3: {
uuid: 'cdf754bd-4626-4da1-b676-9ebe87927a04',
is_finished: false
},
}

现在,队列id为cdf754bd-4626-4da1-b676-9ebe87927a04的用户的位置为2,因为只有一个人面前有未完成的任务。

问题是,因为我所有这些都是从前端(因为我预计在应用程序的重负载和不打算超载我的后端服务器),任何人都可以窃取我的firebase凭据和恶意设置is_finished = true给每个人在他面前。

如何防止这种情况发生?

您可以使用Firebase的服务器端安全规则来控制用户可以写什么。由于这些是在服务器上强制执行的,因此用户无法在客户端代码中绕过它们。

例如,如果用户应该只能添加is_finished设置为false的项,您可以使用验证规则来强制执行。这确实要求你可以区分普通用户和处理队列项的用户,所以通常意味着你要么想要使用Firebase身份验证来识别他们,要么在一个可信的环境(比如你的开发机器,你控制的服务器,或者Renaud提到的Cloud Functions/Cloud run)中使用Firebase的Admin SDK之一运行处理代码。

还可以考虑使用Firebase App Check,这使得恶意用户很难用你的配置密钥运行他们自己的代码。虽然这将有助于防止滥用,但并不能保证消除所有恶意使用,因此您仍然应该采用上述方法。

最新更新