Firebase,不安全的规则

时间:2021-07-24 18:38:04

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

我最近收到一封来自 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

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

我在他们发给我的电子邮件中看到,它说人们可以修改我的数据库,这是从应用程序中引用的,还是表示他们可以破解我或其他什么?

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

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

Data Base

谢谢

2 个答案:

答案 0 :(得分: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;
    }
  }
}

答案 1 :(得分:0)

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),那么您可以在用户集合的用户文档中添加一个字段,即 admin 并将其设置为 true。然后就可以读取文档数据了,如图:

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