【问题标题】:How public is "if request.auth.uid != null" as a security rule in Firestore?“如果 request.auth.uid != null”作为 Firestore 中的安全规则有多公开?
【发布时间】:2019-12-19 10:59:27
【问题描述】:

我正在使用 Firestore 来存储我的数据。这包括用户个人资料详细信息及其在文档中的当前位置,这些信息存储在具有以下安全规则的集合中:

match /profile/{w9o3948s} {
  allow read, write: if request.auth.uid != null;
}

人们有没有办法“浏览”集合中的文档列表并查看用户的位置?还是只能通过我的应用程序中的代码来完成?

文档 ID 是随机生成的,因此即使有人假设知道当前文档 ID,他们将如何查询文档?

【问题讨论】:

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


    【解决方案1】:

    人们有什么办法可以“浏览” 收集和查看用户的位置?

    是的,根据您的安全规则,这是完全可能的

    只要 (1) 某人拥有您的 Firebase 项目的 apiKey 并且 (2) 启用了电子邮件/密码登录方法,此人就可以在您的项目中使用 Firebase Auth REST APIsign-up(即创建一个新帐户)。

    如果您部署链接到 Firebase 项目(Android、iOS、Web...)的应用,获取 apiKey 并不是很困难。


    仅向一组用户(例如,您公司的员工或您的应用的一些付费订阅者)授予访问权限的一种标准方法是使用自定义声明。您将在documentation 中找到使用声明设置访问控制的指南。


    您可能对此article 感兴趣,它介绍了如何使用 Callable Cloud Function 构建一个模块,该模块允许具有特定管理员角色的最终用户创建其他用户,以及如何限制具有一个或多个用户的访问权限特定的自定义声明。 (免责声明,我是作者)。


    或者只能这样做(即浏览集合中的文档列表) 由我的应用程序中的代码完成?

    任何可以对您的应用进行逆向工程的人都可以找到您的 Firestore 集合的名称,并且通过如上所述创建的帐户,可以访问这些集合中的文档。


    文档ID是随机生成的,所以即使有人 假设知道当前文档 ID - 他们将如何查询 文件?

    正如您将在专用于Granular Operations 的安全规则文档部分中阅读的那样,使用read 允许用户获取一个文档AND 来列出集合的所有文档(查询)。因此,如果您想将用户的读取权限限制为仅限于他/她的个人资料,则需要为getlist 设置两条不同的规则。


    所以,总而言之:

    1. 使用自定义声明:它们只能通过 Firebase Admin SDK 从“特权服务器环境”进行设置。 “特权服务器环境”是指您完全控制的服务器或 Firebase 项目中的云功能。
    2. 微调您的安全规则以 (a) 使用规则中的自定义声明和 (b) 使用精细访问权限。

    【讨论】:

    • 很好的回答雷诺。为了只允许“贵公司的员工”,我实际上通常使用stackoverflow.com/a/51850335,而不是自定义声明。
    • @FrankvanPuffelen 感谢您的评论 Frank,以及基于电子邮件域的解决方案的链接。确实很聪明!
    猜你喜欢
    • 2018-05-28
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 2018-03-17
    • 2019-11-18
    • 2018-10-17
    • 2018-08-17
    • 1970-01-01
    相关资源
    最近更新 更多