【问题标题】:Cloud Firestore rules - Allowing anybody to update one specific field in a documentCloud Firestore 规则 - 允许任何人更新文档中的一个特定字段
【发布时间】:2020-05-31 19:17:53
【问题描述】:

我正在开发一个 PoC(概念验证)应用程序,用户可以将壁纸下载到他们的设备上。所有数据均使用 Cloud Firestore & Storage 提供。

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

记住这一点... 我想要一个计数器来跟踪每个特定壁纸的下载次数。

虽然我让它“工作” - 我质疑我在 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;所以唯一一个经过身份验证的用户就是我自己。)
  • 如果数据是数字则更新计数器..

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

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

再次提醒——此应用无需登录,用户无需身份验证即可下载所有壁纸,并且每张壁纸旁边都会有一个计数器,供用户查看每张壁纸已下载了多少次。

【问题讨论】:

  • 只有满足你的应用需求才是安全的。当您在这里表达时,我们无法真正说出这些需求是什么。您要防止的问题是什么?
  • 我不确定为什么接受的答案被接受了。您的问题明确指出 如果数据是数字则更新计数器。 这意味着数据已写入(插入)到您的 Firebase 中。该答案假定不会在您的系统上插入任何数据。此外,您的问题指出 这是部署到生产的安全方法吗? 答案是规则不适用于问题中描述的用例,例如下载壁纸时计数器需要递增,这需要写入,并且写入只能由经过身份验证的用户执行。
  • @Jay - 我将接受的答案上下文“不会在您的系统上插入任何数据”视为正确,因为我是唯一一个创作 new 数据的人。当一个新壁纸被添加到 Firebase(显示在应用程序上)时,计数器默认为 0。通过使用以下行,我(或者我的假设是......)只让公共更新该计数器:allow update: if request.resource.data.counter is number; .我的假设在这里是错误的吗?如果是这样,你会推荐什么规则,记住没有登录,我想要完成的只是更新下载计数器?
  • 明白。我的想法/问题是 Only authenticated users can write 与更新计数器的应用程序冲突,因为如果应用程序可以在未经身份验证的情况下更新计数器,那么任何人都可以,例如我可以制作一个快速应用程序来将该计数器增加到 1,000,000,这不是很好的安全性/安全性。也许我不了解用例。
  • @Jay - 感谢后续行动。我的用途是任何下载该应用程序的人都可以免费查看/下载壁纸。没有任何登录。每次用户下载壁纸时,计数器都会增加。由于这是使用 Cloud Firestore,因此计数器会实时递增。我想要尽可能多的安全性来保护我的数据,同时仍然让计数器按预期递增。基于这个用例,我尝试尽可能“严格”地编写规则。不知道你怎么能劫持我的柜台,但这很有趣!

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


【解决方案1】:

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

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

最重要的是,任何能够获得 Firebase 身份验证 ID 令牌的人(同样,对于坚定的攻击者来说并不难),都可以在数据库中完全创建和写入任何文档。如果您说您的应用程序中根本没有 Auth,那么这并不是真正的问题,但如果您的项目配置为允许任何形式的身份验证,那么攻击者就有可能开始随便写。

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

您应该做的是更具体地定义您的安全要求,然后将其转化为实际满足这些要求的规则。如果您想允许对任何类型的数据库进行未经身份验证的写入访问,那么您会遇到一些麻烦,因为无法确保访问实际上与您尝试测量的下载行为相匹配。您最好在管理下载的任何进程中计算下载次数,这可能需要比您现在拥有的更复杂的后端。

但是,如果您确实想要允许公共读/写访问,那么您最好制定更具体的规则。例如,您可以限制匿名用户可以写入的集合,并确保他们只能增加计数器,如果这些是您想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 2019-11-02
    • 2020-08-17
    • 2020-01-28
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    相关资源
    最近更新 更多