Cloud FireStore安全规则

时间:2020-07-27 09:09:48

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

我有一个使用Firebase中的Cloud FireStore的应用程序。

主要是一个网站,数据存储在Firestore中。所谓数据,是指网站上显示的供每个用户查看的文本和图像。

因此,我每天都会从Firebase收到一封邮件,告诉我我的规则并不安全,因为每个用户都可以读取每个数据(这主要是目标,如果没有,他们将看不到网站上的任何文本)。

之所以这样做,是因为我在网站的某种管理模式下使用了Firebase身份验证,您可以在其中写和更新新数据。

目前,我的规则如下:

rules_version = '2';
service cloud.firestore {

    match /databases/{database}/documents {
        match /{document=**} {
            allow read: if true;
            allow write: if request.auth.uid != null;
          }
    
        match /users/{userId} {
            allow write: if isOwner(userId);
        }
    }
    function isOwner(userId) {
       return request.auth.uid == userId;
    }
}
          

作为Firebase的初学者,我将不胜感激。

欢呼

1 个答案:

答案 0 :(得分:0)

因此,我每天都会从Firebase收到一封邮件,告诉我我的规则并不安全,因为每个用户都可以读取每个数据(这主要是目标,如果没有,他们将看不到网站上的任何文本)。

我不会像Renaud那样忽略这封电子邮件。允许使用递归通配符访问数据库中的每个文档,例如:match /{document=**}会导致意外的安全问题。

相反,您的规则应明确规定哪些集合实际上是公用的,以供任何人查询。只需删除与所有文档匹配的递归通配符,然后分别调用每个集合,电子邮件就会停止:

    match /databases/{database}/documents {
        match /collection1/{id} {
            allow read: if true;
            allow write: if request.auth.uid != null;
        }
        match /collection2/{id} {
            allow read: if true;
            allow write: if request.auth.uid != null;
        }
        match /users/{userId} {
            allow write: if isOwner(userId);
        }
    }

虽然您可能会觉得很不方便,但它可以防止您将来意外允许对不应该公开的其他数据进行读取访问。