为数据读取限制添加Firebase Firestore

时间:2019-12-17 06:37:34

标签: firebase google-cloud-firestore firebase-security

我们有一个使用Firestore的iOS应用。该应用程序仅读取数据(不写入),我们没有用户帐户,并且数据库上的任何内容均不受保护。因此,我们使用了这些幼稚的安全规则

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
       allow read;
    }
  }
}

但是,Firebase警告我们(肯定有充分的理由)这会使我们处于危险之中,原因有两个:

  1. 任何用户都可以从数据库中读取任何内容,因此没有什么是安全的。

我不认为这是一个问题,因为我们没有什么可以保密的。至少到目前为止,这肯定会改变。

  1. 允许无限次读取

这是问题所在。我想一个恶意用户可以读取我们的数据库数百万次,从而关闭我们或者仅仅迫使我们支付大笔账单(我们使用Blaze计划,即付即用)。

我们如何保护我们免受此侵害?我在这里看到过类似的问题,但它们没有提供任何有用的建议,How to limit rate of data reads from Firebase?

我的想法是,我们可以在应用程序中使用匿名用户帐户,然后在我们的安全规则中,仅当用户“登录”(因此使用该应用程序的任何人)时才允许读取。我距离Firebase和安全性问题专家远非如此,但是这是否至少会使某人数百万次读取我们的数据库变得更难或更不可能,因为必须通过该应用程序完成?

还有其他建议可以解决这个问题吗?

Firebase warning message for bad security rules

2 个答案:

答案 0 :(得分:2)

在您允许对文档的读取访问权限之后,实际上并没有一种方法可以限制特定客户端应用程序的读取速率。有了完全公开的阅读规则,互联网上的每个人都可以重复阅读文档以产生费用。不过,发生这种情况的机会确实很小,您应该向Firebase support报告看似侮辱性的行为。

您可以通过调出您希望客户端能够阅读的单个顶级集合来摆脱警告消息。由于Firebase不知道您可能要允许或禁止访问哪些集合,因此应该明确。例如,每个集合都类似这样:

    match /collection1/{document=**} {
       allow read;
    }
    match /collection2/{document=**} {
       allow read;
    }

如果这样做,请确保删除您现在拥有的允许访问所有文档的规则。

答案 1 :(得分:1)

如果它只是只读操作,那么您可以考虑使用remote config,因为远程配置是完全免费的。 但是,如果您的情况需要使用Firestore数据库,请考虑使用Firebase匿名登录并设置以下安全规则

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /collection_name/{documentId} {
      allow read: if request.auth.uid != null;
      allow write: if false;
    }
  }
}