Firebase-防止恶意用户拉取整个数据库



我在看Firebase文档视频时注意到,在这个视频中:https://www.youtube.com/watch?v=9sOT5VOflvQ&list=PLl-K7zZEsYLn8h1NyU_OV6dX8mBhH2s_L&索引=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

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

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

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

最新更新