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

Har*_*wal 3 firebase firebase-security google-cloud-firestore

我有一个名为 firestore 的集合letters,其中包含用户的公开信。在我的应用程序中,当结果转到 时,我使用分页将结果限制为 20 个public letters screen。我担心的是,这在应用程序内可以正常工作,但如果某些恶意用户从邮递员那里查询数据库,那么我将为所有这些读取付费。我已经制定了所有安全规则,例如用户应该经过身份验证,但这需要是公共集合,所以我想不出其他任何东西来限制这一点。如何限制某人一次阅读 20 份左右的文档?

Dou*_*son 6

实际上没有办法根据直接查询量来限制集合的消耗。Renaud 的答案建议在安全规则中使用request.query.limit,但这并不能阻止恶意用户简单地根据需要多次调用分页 API。limit()它只是迫使他们在每个查询上提供一个。调用者仍然可以使用整个集合,并且可以根据需要多次使用它。

观看我有关该主题的视频:https://youtu.be/9sOT5VOflvQ?t=330

如果您想对要阅读的文档总数实施硬性限制,您将需要一个后端来做到这一点。客户可以从后端请求文档,最多可达其强制执行的限制。如果后端想要允许分页,则必须以某种方式跟踪所提供端点的使用情况,以防止每个调用者耗尽您想要强制执行的任何限制或配额。


Ren*_*nec 5

正如文档中所解释的:

request.query变量包含 查询的limitoffset和属性。orderBy

所以你可以写这样的规则:

allow list: if request.query.limit <= 20;
Run Code Online (Sandbox Code Playgroud)

请注意,我们使用list, 而不是read。医生说:

您可以将读取规则分解为getlist规则。规则get适用于单个文档的请求,规则适用list于查询和集合请求。

  • 实际上这并不能阻止有人使用分页 API 来限制读取。调用者仍然可以根据需要读取任意数量的 20 个批次 - 他们可以通过这种方式轻松使用整个集合,并且可以根据需要多次使用它。所有这一切都要求每个查询的限制为 20 或以下。 (2认同)