【问题标题】:Protecting Firestore without requiring authentication无需身份验证即可保护 Firestore
【发布时间】:2021-10-27 19:40:30
【问题描述】:

因此,目前在项目中,我们有一组不需要身份验证即可读取的文档。它们受写/更新保护,但每个人都可以阅读。

我们试图阻止的是有人查看了 firebase 端点并设法以 json 格式抓取整个集合(如果这甚至可能的话)。这些数据是公开的,但我希望它只能从我们的网站访问。

我们能想到的解决方案之一是 SSR(我们已经在使用 Next.js),但仅仅出于这个原因实现 SSR 似乎并不十分诱人。

任何建议将不胜感激。

编辑: 让我稍微改写一下。 从您在网络选项卡中看到的内容来看,是否可以伪造/创建对 Firestore 的请求并获取整个集合,而不仅仅是预期的 1 个文档?

【问题讨论】:

  • 因此要求应用程序批量检索文档,但您想防止不良行为者检索该数据?这听起来有点像机器人检测,为什么要让抓取数据变得困难?
  • 是的,几乎是机器人检测。我们不希望任何人能够抓取我们的数据并将其用于自己的应用程序。该应用程序一次只检索少量文档。我担心的是有人可以只发送 1 个请求并下载我们的整个集合。

标签: reactjs firebase google-cloud-firestore


【解决方案1】:

在您的情况下,最好的解决方案是 SSR。我知道,这听起来可能不那么诱人,但好吧,让我们来讨论一下何时应该使用 SSR。在您的用例中,有一个重要要求:安全性。我认为这已经是证明使用 SSR 的充分理由。

此外,为 next.js 应用创建一个临时服务帐户,并使用自定义规则保护数据,只允许该服务帐户读取您的数据,只会提高整体安全级别。

最后:读取数据服务器端应该会让你的网站工作得更快一点,即使它很难被注意到,因为我们谈论的是毫秒。请注意,您的页面现在需要加载,然后才能向 Firebase 发送请求。这增加了一个小的延迟。如果数据是在服务器端加载的,则不增加延迟。

【讨论】:

  • 是的,不幸的是 SSR 可能是要走的路。从您在网络选项卡中看到的内容来看,是否可以伪造/创建对 Firestore 的请求并获取整个集合,而不仅仅是预期的 1 个文档?
  • 是的,有可能。这就是为什么最好实现读取服务器端或通过函数/rest api 实现,但这只会在架构中添加另一层并使其变慢
  • App Check 能防止这种情况发生吗?
  • 不。根据文档,App Check 不适用于 Firestore:firebase.google.com/docs/app-check
  • 好吧,我想我们最终会做 SSR。感谢您的帮助,非常感谢。
【解决方案2】:

是否可以伪造/创建对 Firestore 的请求并获取整个集合,而不仅仅是预期的 1 个文档?

如果您想限制人们可以从集合中请求的内容,您正在寻找安全规则。最常见的模型是某种形式的ownership-based access controlrole-based access control,但两者都需要某种方式来识别用户。这可能是anonymously(因此无需他们输入凭据),但它仍然是一种身份验证形式。

如果您不想这样做,您仍然可以控制一次性通过 API 获取多少数据。例如,如果您在安全规则allow get but not list 中,则用户只有在知道其 ID 后才能请求文档。即使你允许列表,你也可以control in rules what queries are allowed

【讨论】:

  • 这个很有意思,我一定会看看的。谢谢
【解决方案3】:

我认为一种方法可能是编写一个使用管理 SDK 检索此公共数据的云函数。然后,您可以设置任何人都无法阅读这些文档的规则。这意味着只有带有管理 SDK 的 Cloud Function 才能访问这些文档。

最后,您可以为该特定云功能设置 AppCheck,这样,您可以确保请求仅来自您的客户端应用程序。

https://firebase.google.com/docs/app-check

【讨论】:

  • 我尝试了类似的方法,但是云功能根本不够快。我一直在环顾四周,我试图弄清楚它甚至可能仅从您在网络选项卡中看到的内容中,伪造对 firestore 和检索集合的请求。
  • 没错,它可能比直接从客户端获取数据要慢。当您希望通过后端程序完全控制某些东西时,这是(我认为)要考虑的权衡之一。顺便说一句,您的 Cloud Functions 是否与您的 Firestore 服务位于同一区域?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 2017-03-04
  • 1970-01-01
相关资源
最近更新 更多