Firebase 您的 Cloud Firestore 数据库对基本安全规则有不安全的规则

时间:2021-01-05 13:35:56

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

最近我收到了大量关于以下方面的 Firebase 通知:

<块引用>

[Firebase] 您的 Cloud Firestore 数据库有不安全的规则

<块引用>

我们检测到您的安全规则存在以下问题:任何用户都可以写入您的整个数据库。由于您的项目没有严格的安全规则,任何人都可以访问您的整个数据库。攻击者可以窃取、修改或删除您的数据,并提高您的账单。`

Edit2:我需要的是允许所有人无需任何登录即可写入,但只有管理员帐户才能从 Firebase 控制台读取它.

实时数据库规则:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

Cloud Firestore 规则:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow write;
    }
  }
}

编辑: JSON 中的数据库结构之一,其他看起来类似:

{
  "battles" : {
    "-KjiAFLI8oE_12345678" : {
      "full" : true,
      "player1" : {
        "movement" : {
          "down" : false,
          "left" : false,
          "right" : false,
          "up" : false
        },
        "position" : {
          "x" : 0,
          "y" : 0
        }
      },
      "player2" : {
        "movement" : {
          "down" : false,
          "left" : false,
          "right" : false,
          "up" : false
        },
        "position" : {
          "x" : 0,
          "y" : 0
        }
      }
    },
    "-KjiAMVvJydR12345678" : {
      "full" : true,
      "player1" : {
        "movement" : {
          "down" : false,
          "left" : false,
          "right" : false,
          "up" : false
        },
        "position" : {
          "x" : 0,
          "y" : 0
        }
      },
      "player2" : {
        "movement" : {
          "down" : false,
          "left" : false,
          "right" : false,
          "up" : false
        },
        "position" : {
          "x" : 0,
          "y" : 0
        }
      }
    }
  }
}

Edit3:Firebaser's answerFirebase email saying my realtime database has insecure rules 相比,我不想/不使用 Firebase 身份验证/SSO

鉴于这些情况,我是否必须/应该以某种方式修改它们?

2 个答案:

答案 0 :(得分:2)

我收到了这些电子邮件,但我无法修复我的电子邮件,因为我的系统就是这样工作的。

就你而言,原因是:

allow write;

在您的 Cloud Firestore 规则中。这意味着任何人都可以从任何地方访问数据库。

因此,

<块引用>

攻击者可以窃取、修改或删除您的数据,并且可以抬高您的账单。

将此规则更改为仅允许经过身份验证的访问,警报应停止。 卢卡 S.

答案 1 :(得分:2)

我可以想到两种解决方案,而不会危及安全(在某种程度上):

  1. 您可以对用户使用身份验证,并且只允许对经过身份验证的用户进行读取或写入访问。 (我知道在编写游戏时特别麻烦。)像这样:
match /databases/{database}/documents {
    match /{document=**} {
      allow write: if request.auth != null;
    }
  }
}
  1. 您可以使用某种 10 个字符的序列,例如与数据库中的文档名称(例如,“Users-xQnFiECweq”)结合使用,然后相应地编辑您的安全规则。

例如:

match /Users-xQnFiECweq {
    match /Courses-QrmGvMgF9C {
        match /{multiSegment=**}{
            allow write;
        }   
    }
}

文档或集合名称末尾的字符串值充当只有您知道的密码,并且其他人很难猜测您数据库的确切结构。

我知道这是一种有点奇怪的方法,但总比只给每个人写访问权限要好。