0

我正在开发一个 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;所以第一个也是唯一一个经过身份验证的用户是我自己。)
  • 如果数据是数字,则更新计数器..

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

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

再次——无需登录,用户无需认证即可下载所有壁纸,每张壁纸旁边都会有一个计数器,供用户查看每张壁纸下载了多少次。

4

1 回答 1

1

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

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

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

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

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

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

于 2020-02-20T16:32:48.320 回答