我最近收到一封来自 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
我需要经过身份验证的用户才能阅读和创建内容。所以请使用我上面提到的规则。
我在他们发给我的电子邮件中看到,它说人们可以修改我的数据库,这是从应用程序中引用的,还是表示他们可以破解我或其他什么?
因为我的应用的最终目的是用户可以创建内容。
但我不希望有人侵入我的数据库并删除所有内容,这可能吗?
谢谢
答案 0 :(得分:1)
电子邮件是因为规则并不严格。您可能应该使用以下规则:
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;
}