首页 > 解决方案 > Cloud FireStore 安全规则

问题描述

我有一个使用 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 的初学者,我将不胜感激。

干杯

标签: angularfirebasegoogle-cloud-firestorefirebase-security

解决方案


所以我每天都会收到一封来自 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);
        }
    }

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


推荐阅读