【问题标题】:Secure Firestore database using rules. Check authentication. Is it enough?使用规则保护 Firestore 数据库。检查身份验证。够了吗?
【发布时间】:2020-06-20 19:30:45
【问题描述】:

我是 Firebase 的新手,正在尝试了解数据库规则。我正在使用 Firestore。

我有一个数据库,基本上需要所有用户读取,也需要写入。所有用户都可以查看数据库中的文档,并通过某些操作更改某些字段。在某些情况下,他们会删除某些旧的过期文件。

现在,我知道我不能对所有人开放读写,因为这不安全。所以我使用身份验证,我会匿名对用户进行身份验证,这样只有经过身份验证的用户才能访问。

我知道这样做可以:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth.uid != null;
    }
  }
}

现在,我的问题是,这够了吗?我不是黑客,所以我不知道黑客将如何或可能如何破解和删除/更改我的数据库中的内容,但这是否意味着只能通过使用该应用程序对数据库进行更改?如果他们不使用该应用程序并以其他非法方式进行身份验证,是否有人仍然可以破解它。

非常感谢您的帮助,我已尝试阅读以了解详情,但没有成功。

【问题讨论】:

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


    【解决方案1】:

    这是否意味着只能通过以下方式对数据库进行更改? 使用该应用程序?

    任何可以获取您的Firebase config elements 的人都可以使用 JavaScript SDK 编写一个简单的 HTML 页面并尝试与您的 Firestore 后端进行交互。请注意,获取 Firebase 配置元素并不难,请参阅底部了解更多详细信息。

    这就是为什么如果您想保护您的数据,实施一组安全规则至关重要。

    现在,请务必注意以下关于 Firebase 身份验证和“注册”用户的要点:

    您应该注意,任何人都可以“通过调用 createUserWithEmailAndPassword() 方法或通过使用联合身份提供程序(例如 Google Sign-InFacebook Login)首次登录用户来在您的 Firebase 项目中创建新用户”(当然,如果这些身份提供者被激活)。请参阅doc

    因此,再次使用您的 Firebase 配置元素,有人可以轻松构建调用 createUserWithEmailAndPassword() 方法的 HTML 页面。

    这意味着,如果您只想通过在 Firestore 安全规则中使用 allow read, write: if request.auth.uid != null 来限制某些特定用户访问您的应用,这还不够

    一种可能的方法是使用Custom Claims。例如,您可以为所有授权用户设置特定声明(例如,authorized = true)并调整您的安全规则以检查用户令牌中是否存在此声明。


    注意:如何找到网络应用的 Firebase 配置元素?

    找到 Firebase 配置对象并不难。只需在构成应用程序的所有 HTML 或 JS 文件中查找 apiKey 字符串即可。

    【讨论】:

    • 谢谢,如果我理解正确的话。我可以使用“自定义声明”,当用户通过应用程序“注册”时,我会创建一个虚拟字段,例如“userIsGenuine = true”。然后我在firestore规则中规定只有具有“userIsGenuine = true”字段的用户才能读取写入数据库。这会停止吗,任何从简单的 html 页面创建 UserWithEmailAndPassword 的人?
    • "这会停止吗,任何从一个简单的 html 页面createUserWithEmailAndPassword 的人" -> 不会,它不会阻止恶意用户使用createUserWithEmailAndPassword() 方法创建用户,但这些用户不会拥有在您的安全规则中使用的自定义声明,因此它们将无法访问您的数据。
    • 您可能会对阅读以下article 感兴趣,该article 解释了如何构建一个模块,该模块允许具有特定管理员角色的最终用户创建其他用户并为他们分配其他特定用户角色。这并不完全是您正在寻找的东西,但其中使用的大多数概念都以一种或另一种方式适用于您的案例。 (免责声明,我是作者
    • 太好了,这正是我所需要的。我也可以在匿名登录时使用“自定义声明”吗?
    • 甚至没有人可以将 JavaScript 注入网页。 Firebase Auth 使用的所有 API 端点基本上都可供公众直接使用。它们不需要由提供的 SDK 调用。他们甚至在这里记录:firebase.google.com/docs/reference/rest/auth
    【解决方案2】:

    Firebase 安全规则不能限制对单个应用的访问。所有 API 都可供任何有互联网连接的人公开使用。它们都记录在这里:https://firebase.google.com/docs/reference/rest/auth

    Firebase 身份验证的目的是确保个人用户的个人访问得到适当控制。只要您让用户使用匿名或电子邮件身份验证创建帐户,他们就可以使用这些规则完全访问数据库中的所有文档。因此,根据该词的大多数定义,您现在拥有的并不是真正的“安全”。您必须决定这对于您的目的是否足够“安全”。

    您也可能会收到来自 Firebase 的电子邮件,说您的规则不安全。像这样使用/{document=**} 不是一个好主意,它匹配所有文档,这可能不是您想要的。至少,您应该调用您希望用户访问的各个集合,而不是使用此全局通配符。

    【讨论】:

      猜你喜欢
      • 2018-05-31
      • 2020-09-24
      • 2020-05-10
      • 2016-03-06
      • 2018-08-25
      • 2021-01-22
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      相关资源
      最近更新 更多