我正在观看 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
这在我看来是最可行的方法,但如果其他人对此有想法,他们将不胜感激!
答案 0 :(得分:1)
问题是您无法在此查询发生时更新 last-time
。而且由于您无法在他们读取时更新 last-time
,因此无法通过此机制限制用户可以执行的读取次数。
由于这个限制,它可能在安全规则中implement a write rate limit,但不是读取速率限制。