【发布时间】: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