【问题标题】:Cloud FireStore Security RulesCloud FireStore 安全规则
【发布时间】:2020-07-27 09:09:48
【问题描述】:

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

干杯

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的意见。当我按照您的建议进行操作时,我的网站上没有显示任何数据。我显然用我自己的收藏名称替换了“collection1,...”。
    • 如果您有新问题,请发布新问题并说明哪些特定代码未按您预期的方式运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2021-04-21
    • 2020-11-27
    • 2021-11-22
    • 2020-08-21
    • 2021-12-11
    相关资源
    最近更新 更多