Firebase 当一些恶意用户查询数据时,如何限制firestore中庞大集合的文档读取次数?

Firebase 当一些恶意用户查询数据时,如何限制firestore中庞大集合的文档读取次数?,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,我有一个名为letters的firestore集合,其中保存了一封来自用户的公开信。在我的应用程序中,我使用分页将结果限制为20,当它们进入公共信函屏幕时。我担心的是,这会在应用程序内部正常工作,但如果有恶意用户从(比如邮递员)那里查询数据库,那么我将为所有这些读取行为支付巨额费用。我有所有的安全规则,比如用户应该经过身份验证,但这需要是公共收集,所以我想不出任何其他东西来限制这一点。如何限制某人一次阅读大约20份文档?如中所述: 该变量包含、偏移量和orderBy 查询的属性 因此,您可以编写

我有一个名为
letters
的firestore集合,其中保存了一封来自用户的公开信。在我的应用程序中,我使用分页将结果限制为20,当它们进入
公共信函屏幕时。我担心的是,这会在应用程序内部正常工作,但如果有恶意用户从(比如邮递员)那里查询数据库,那么我将为所有这些读取行为支付巨额费用。我有所有的安全规则,比如用户应该经过身份验证,但这需要是公共收集,所以我想不出任何其他东西来限制这一点。如何限制某人一次阅读大约20份文档?

如中所述:

该变量包含、
偏移量
orderBy
查询的属性

因此,您可以编写如下规则:

allow list: if request.query.limit <= 20;

allow list:if request.query.limit实际上无法基于直接查询量限制集合的使用。Renaud的回答建议在安全规则中使用
request.query.limit
,但这并不能阻止恶意用户对分页API进行任意多的调用。它只是强制他们在每个查询上提供一个
limit()
。调用者仍然可以使用整个集合,并根据需要多次使用它

观看我关于以下主题的视频:


如果您想强制执行要读取的文档总数的硬限制,则需要一个后端来执行此操作。客户端可以从后端请求文档,直到达到其强制执行的限制。如果后端希望允许分页,它必须以某种方式跟踪所提供端点的使用情况,以防止每个调用方用尽您想要强制执行的任何限制或配额。

实际上,这并不会阻止某人使用分页API限制读取。调用者仍然可以读取任意数量的20个批次-他们可以通过这种方式轻松地使用整个集合,并根据需要多次使用它。所有这些都要求每个查询限制在20或20以下。@DougStevenson假设我强迫我的用户登录以阅读文档,如果查询限制超过20,则将他们的电子邮件记录到一个集合中,并更新规则,以便在未来几天内不允许发送此电子邮件。可以这样做吗?。我可以对他们采取任何措施吗?您能更准确地说明您的确切要求吗?我可能误解了您的问题,以为您想将每个分页调用限制为20个文档。如果不是这样,那么我的答案是不正确的。为了删除它,你需要取消接受它。我认为你的问题是正确的,你的答案也是有意义的,但正如道格指出的那样,没有办法限制恶意用户这样做。可以简单地反复执行read语句,以20为限制。