【问题标题】:What should be approach to store publicly writable data?存储可公开写入数据的方法应该是什么?
【发布时间】:2019-11-11 18:15:48
【问题描述】:

我有一个user-profile 收藏。目前它只能由其个人资料的用户写入。

现在我想记录“访问个人资料的次数”计数,比如说profileVisitedCount。而且,如果非登录用户访问配置文件,它也会计算在内。

如果我将计数存储在来自 firebase js 客户端库的 user-profile 集合本身的文档中,我将不得不使其公开可写。

我正在考虑的其他选择是具有云功能。它只会增加profileVisitedCount,而不需要使文档公开可写。但不确定这是否是正确的方法,因为云函数端点似乎仍然存在漏洞并且可以被 bot 调用。

另外,是的,“个人资料访问计数”类型的数据应该记录在 GA 等分析中,但我需要将此计数用于显示访问次数最多的个人资料等业务逻辑之一。

那么,关于如何构建数据的任何指导?谢谢!

【问题讨论】:

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


    【解决方案1】:

    您可以有另一个名为profileVisitsCounters 的集合,您可以在其中为每个用户存储一个文档,文档ID 对应于用户ID。在此用户文档中,您维护一个专用的 profileVisitedCount 字段,每次用户阅读相应的配置文件时,您都会使用 increment() 更新该字段。

    您使用allow read, write: if true; 分配对该集合的完全读写访问权限。


    在您的问题中,在提到云功能解决方案时,您写道“云功能端点似乎仍然容易受到攻击,并且可以被机器人调用”。请注意,在具有完全写入权限的额外集合的情况下,如上所述,情况也是如此:例如,知道集合名称和用户 uid 的人可以调用 update() JavaScript SDK,或者更简单的是Cloud Firestore API 的端点。


    如果您想避免这种风险,您可以使用callable Cloud Function 来阅读用户配置文件,正如您所提到的。此云功能将:

    1. 获取用户配置文件数据;
    2. 增加profileVisitedCount 字段(在用户配置文件中);
    3. 将用户配置文件数据发送回客户端。

    您需要拒绝对user-profile 集合的读取权限,以强制用户通过云函数“读取”它。

    这样您就可以确定profileVisitedCount 字段只有在读取“真实”用户配置文件时才会增加

    另请注意,如果拥有两个不同的集合为您的业务案例带来一些额外优势,您仍然可以保留 profileVisitsCounters 集合。在这种情况下,云函数将增加此集合中的计数器,而不是在用户配置文件本身中增加它。由于 Cloud Function 绕过安全规则,您将限制 profileVisitsCounters 集合的访问权限为只读。 (allow read: if true; allow write: if false;)。


    最后,请注意阅读 article 可能会很有趣,其中详细介绍了使用 Cloud Functions 查询 Firebase 数据库的优缺点。

    【讨论】:

    • 感谢@Renaud Tarnec,感谢您提供详细的解释和选项。如果我使用 callable Cloud Function 读取用户配置文件,它会不会再次被公开并且可以被 bot 脚本调用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 2013-11-08
    • 2016-08-29
    • 2012-02-25
    • 2016-07-17
    • 2018-12-23
    • 2013-10-14
    相关资源
    最近更新 更多