首页 > 解决方案 > Firebase - 防止恶意用户提取整个数据库

问题描述

我正在观看 Firebase 文档视频并注意到在此视频中:https ://www.youtube.com/watch?v=9sOT5VOflvQ&list=PLl-K7zZEsYLn8h1NyU_OV6dX8mBhH2s_L&index=4

在 6:39,Doug 提到可以通过执行以下操作来限制一个查询返回的文档数量: allow list if: request.query.limit <= 20

然而,他提到,虽然这样做是有益的,因为它可以防止您意外执行一组非常昂贵的读取操作,但它仍然无法阻止恶意用户通过发出多个请求并使用分页来筛选您的数据库来读取您数据库中的所有内容. 我可以在 JavaScript 中设想某种无限的 while 循环,这使得这非常有问题且代价高昂。

我能想到解决这个问题的唯一方法可能是通过某种方式使用时间戳,并保存一些与每个用户相关的信息,这些信息会通知数据库他们上次发出请求的时间。是否可以这样做,然后访问安全规则中的那些时间戳?类似于(其中第二个条件是一种伪代码):

allow list if: request.query.limit <= 20 && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.last-time <= 100

在我看来,这似乎是最可行的方法,但如果其他人对此有想法,他们将不胜感激!

标签: firebasegoogle-cloud-firestorefirebase-authenticationfirebase-security

解决方案


last-time问题是发生此查询时您无法更新。而且由于您无法last-time在他们阅读时进行更新,因此无法限制用户可以通过此机制执行的阅读次数。

由于这个限制,可以在安全规则实现写入速率限制,但不能实现读取速率限制。


推荐阅读