Cloud Firestore规则-允许任何人更新文档中的一个特定字段

时间:2020-02-16 19:52:23

标签: firebase google-cloud-firestore firebase-authentication firebase-security flamelink-cms

我正在研究PoC(概念验证)应用程序,用户可以将壁纸下载到他们的设备上。所有数据都使用Cloud Firestore和存储提供。

此应用程序没有登录。任何人都可以下载该应用程序,然后立即下载他或他想要的壁纸。

记住这一点... 我希望有一个计数器来跟踪每个特定墙纸的下载次数。

当我让它“运行”时-我在质疑我在Firebase中设置的规则。

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read;
      allow write: if request.auth != null;
      allow update: if request.resource.data.counter is number;
    }
  }
}

我对上述规则的思考过程:

  • 任何人都可以阅读。
  • 只有经过身份验证的用户才能写。 (我正在使用无头CMS; Flamelink管理所有数据;因此,只有1个经过身份验证的用户是我自己。)
  • 如果数据是数字,则更新计数器。

我要问的是这最后一条规则。

这是部署到生产环境的安全方法吗?

再次-该应用程序无需登录,用户无需身份验证即可下载所有壁纸,并且每个壁纸旁边都会有一个计数器供用户查看每个壁纸已被下载多少次。

1 个答案:

答案 0 :(得分:1)

根据该单词的任何常规定义,规则都不是“安全的”。这就是他们所允许的。知道项目名称(很容易获得)的任何具有Internet连接的人都可以:

  • 查询数据库中的任何文档
  • 使用任何文档中的counter的任何数值更新任何现有文档(它甚至不必递增或为正整数)

最重要的是,任何能够获得Firebase Auth ID令牌的人(同样,对于确定的攻击者而言并不困难),可以完全在数据库中创建和写入任何文档。如果您说您的应用程序中根本没有Auth,那么这实际上不是问题,但是如果您的项目配置为 进行任何形式的身份验证,则攻击者可能会启动写什么。

您将收到Firebase的电子邮件,说明您的规则不安全,主要是因为您允许所有人阅读所有内容。

您应该做的是更具体地定义您的安全要求,然后将其转换为实际满足这些要求的规则。如果要允许对任何类型的数据库进行未经身份验证的写访问,您将遇到麻烦,因为无法确保该访问确实与您要衡量的下载行为相匹配。无论采用哪种方法来管理下载,您最好不要计算下载量,这可能需要比现在更复杂的后端。

但是,如果确实允许您允许公共读/写访问,则可以通过使规则更具体而更好。例如,您可以限制匿名用户可以写入的集合,并确保只有这些情况您才能增加计数器的数量。

相关问题