【问题标题】:Firebase, insecure rulesFirebase,不安全的规则
【发布时间】:2021-07-24 18:38:04
【问题描述】:

我最近收到了一封来自 firebase 的电子邮件,告诉我我的数据库 (Firestore) 的规则不安全,因此我将它们更改为以下内容:

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

在我有这些规则之前:

allow read, write: if true;

进行更改后,电子邮件不断返回,我不知道还能做什么。 我已经尝试了此链接中给出的以下几个选项,但它们都不能满足我的需要。

https://firebase.google.com/docs/rules/insecure-rules#firestore

我需要经过身份验证的用户才能阅读和创建内容。所以请使用我上面提出的规则。

我看到他们发给我的电子邮件中说人们可以修改我的数据库,这是指来自应用程序,还是意味着他们可以破解我或其他什么?

因为我的应用的最终目的是用户可以创建内容。

但我不希望有人侵入我的数据库并删除所有内容,这可能吗?

谢谢

【问题讨论】:

  • 您能分享一下您的数据库结构是什么样的以及哪些用户可以编辑文档吗?用户是否应该能够编写我的回答中提到的任何文档?
  • 是的,用户必须能够创建内容,我唯一想知道的是,如果我使用这些规则是否意味着有人可以破解我或其他什么?
  • 我的数据库来自 Firestore,有两个集合,一个是用户,另一个是帖子,其中添加了所有用户的帖子。

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


【解决方案1】:

这些电子邮件是因为规则并不严格。您可能应该使用以下规则:

  1. 允许未经身份验证的用户读取数据
  2. 允许经过身份验证的用户创建条目
  3. 允许更新和删除只属于自己而不属于他人的条目。
service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow create: if request.auth.uid == request.resource.data.author_uid;
      allow update, delete: if request.auth.uid == resource.data.author_uid;
    }
  }
}

阅读此article 以获得更好的理解。您还可以检查firestore 何时将规则标记为对here 不安全。更重要的是,这是需要强调的一点。

请记住,Firebase 允许客户直接访问您的数据,并且 Firebase 安全规则是阻止访问的唯一保障 恶意用户。与产品逻辑分开定义规则具有 优势数量:客户不负责执行 安全性,错误的实现不会损害您的数据,并且 最重要的是,您不依赖中间服务器 保护来自世界各地的数据。

示例规则

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userDoc} {
      allow read: if true
      allow create: if request.auth.uid == request.resource.data.id;
      allow update, delete: if request.auth.uid == resource.data.id;
    }

    match /posts/{postDoc} {
      allow read: if true
      allow create: if request.auth.uid != null;
      allow update, delete: if request.auth.uid == resource.data.user_id;
    }

    match /comments/{commentDoc} {
      allow read: if true
      allow create: if request.auth.uid != null;
      allow update, delete: if request.auth.uid == resource.data.user_id;
    }
  }
}

【讨论】:

  • 但如果我希望所有用户都能够创建内容,如 intsgram.我该怎么做?因为在你给我的例子中,他们只能在他是作者的情况下创建,但在我的应用程序中,人们可以评论其他用户的其他帖子。
  • 上面的例子是正确的。这完全取决于您如何构建数据库。
  • 是的!您需要确保只有所有者才能修改条目,而对所有人授予读取访问权限。所以记住这一点,你应该构建你的数据库。
  • 不管你有多少集合,我们的想法是针对每个集合中的每个条目维护 user_id。它可以在postscomments 或任何其他集合中。因此,当您尝试更新或删除时,您只需使用 request.resource.data.user_id 对照条目的 user_id 验证 request.auth.id。因此,所有用户都可以创建内容,但只有拥有该条目才能进行修改。现在清除吗?
  • @Unpocodetodos 我在回答中附上了示例规则,让您更好地了解应该如何指定规则。理想情况下,请为每个集合指定规则,而不是为所有集合指定一个通用规则。
【解决方案2】:

documentation 中提到了这种情况。任何经过身份验证的用户都可以写入您的数据库,这也涉及删除数据。您正在使用递归通配符,使他们能够访问完整的数据库。

请尝试允许用户仅编写自己的文档或类似内容的规则。

rules_version = '2';
service cloud.firestore {
  match / databases / {database} / documents {
    match /collectionName/{docId} {
     allow read: if true;
    allow write: if request.auth != null && request.auth.uid == docId;
    }
  }
}

以上示例将允许用户编辑文档 ID 仅等于其 UID 的文档。

如果您希望允许选定的用户写入(例如 admin),那么您可以在 users 集合中的用户文档中添加一个名为 admin 的字段并将其设置为 true。然后就可以读取文档数据如图:

match /collection/{document} {
      allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
      allow read: true;
    }

【讨论】:

  • 但是如果我希望所有用户都能够创建内容,就像 intsgram 中那样。我该怎么做?当他们说“访问完整的数据库”时,他们的意思是他们可以破解我吗?
猜你喜欢
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 2016-08-19
  • 2020-09-06
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多