Firebase数据库快速入门处理计数的方式安全吗?

Zigmars Dzerve

我想为喜欢的文章创建一个增量字段。

我指的是此链接:https : //firebase.google.com/docs/database/android/save-data#save_data_as_transactions

在示例中,有用于增量字段的代码:

if (p.stars.containsKey(getUid())) {
    // Unstar the post and remove self from stars
    p.starCount = p.starCount - 1;
    p.stars.remove(getUid());
} else {
    // Star the post and add self to stars
    p.starCount = p.starCount + 1;
    p.stars.put(getUid(), true);
}

但是,如何确定用户是否已经喜欢/不喜欢这篇文章呢?

在示例中,用户(黑客)可能会像这样清除整颗星星地图,并且无论如何都会保存:

p.stars = new HashMap<>();

这会破坏其他已经喜欢它的用户的逻辑。

我什至不认为您可以为此制定规则,尤其是对于“减少计数”操作。

有任何帮助,建议吗?

弗兰克·范普菲伦

安全规则可以做一些事情:

  • 确保用户只能将自己的添加/删除uidstars节点

    "stars": {
      "$uid": {
        ".write": "$uid == auth.uid"
      }
    }
    
  • 确保用户只能在starCount将自己uidstars节点添加节点或从节点删除节点更改节点

  • 确保用户只能增加/减少starCount1

即使有了这些,要确保starCount具有等于stars节点中uid数量的安全规则,确实可能仍然很棘手我鼓励您尝试一下,并分享您的结果。

我见过大多数开发人员处理此问题的方式是:

  • 在客户端上进行启动计数(如果stars节点的大小不太大,这是合理的)。
  • 在整合stars的伺服器上执行的信任程序starCount它可以使用child_added / child_removed事件来增加/减少。

更新:带有工作示例

我写了一个投票系统的工作示例。数据结构为:

votes: {
  uid1: true,
  uid2: true,
},
voteCount: 2

当用户投票时,该应用会发送多位置更新:

{
  "/votes/uid3": true,
  "voteCount": 3
}

然后删除他们的投票:

{
  "/votes/uid3": null,
  "voteCount": 2
}

这意味着应用程序需要使用以下命令显式读取的当前值voteCount

function vote(auth) {
  ref.child('voteCount').once('value', function(voteCount) {
    var updates = {};
    updates['votes/'+auth.uid] = true;
    updates.voteCount = voteCount.val() + 1;
    ref.update(updates);
  });  
}

它本质上是一个多位置事务,但随后内置了应用程序代码和安全规则,而不是Firebase SDK和服务器本身。

安全规则可以做一些事情:

  1. 确保voteCount只能增加或减少1
  2. 确保用户只能添加/删除自己的投票
  3. 确保人数增加伴随投票
  4. 确保计数减少伴随着“撤消”
  5. 确保投票增加计数

请注意,规则不会:

  • 确保“取消表决”伴随计数减少(可以通过.write规则完成
  • 重试失败的投票/投票(以处理并发投票/投票)

规则:

"votes": {
    "$uid": {
      ".write": "auth.uid == $uid",
      ".validate": "(!data.exists() && newData.val() == true &&
                      newData.parent().parent().child('voteCount').val() == data.parent().parent().child('voteCount').val() + 1
                    )"
    }
},
"voteCount": {
    ".validate": "(newData.val() == data.val() + 1 && 
                   newData.parent().child('votes').child(auth.uid).val() == true && 
                   !data.parent().child('votes').child(auth.uid).exists()
                  ) || 
                  (newData.val() == data.val() - 1 && 
                   !newData.parent().child('votes').child(auth.uid).exists() && 
                   data.parent().child('votes').child(auth.uid).val() == true
                  )",
    ".write": "auth != null"
}

jsbin带有一些代码对此进行测试:http ://jsbin.com/yaxexe/edit?js,console

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Firebase 数据库安全

来自分类Dev

续集(Ruby),如何以安全的方式递增和使用数据库计数器?

来自分类Dev

Firebase数据库删除安全规则

来自分类Dev

Firebase 实时数据库中需要安全规则吗?

来自分类Dev

您可以控制 firebase 实时数据库安全规则中的各个属性吗?

来自分类Dev

为产品变体设计数据库的最佳方式

来自分类Dev

从Firebase数据库检索数据并快速进行操作

来自分类Dev

我可以在Symfony2中以编程方式访问数据库查询计数器吗

来自分类Dev

Azure - 应用服务 - 移动应用快速入门 - 连接数据库

来自分类Dev

快速查询firebase数据库的中间部分

来自分类Dev

快速从firebase数据库中读取子值

来自分类Dev

SQL数据库触发线程安全吗?

来自分类Dev

存储mysql数据库连接安全吗?

来自分类Dev

数据库中具有属性的Firebase安全规则

来自分类Dev

Firebase /数据库-版本2安全规则?

来自分类Dev

用于查询的Firebase Realtime数据库安全规则

来自分类Dev

Firebase数据库安全规则块发布

来自分类Dev

新用户的 Firebase 数据库安全

来自分类Dev

从数据库获取每月统计数据的优雅方式(没有动态 SQL)?

来自分类Dev

如何安全地实现Facebook登录和设计数据库?

来自分类Dev

如何安全地实现Facebook登录和设计数据库?

来自分类Dev

在多线程环境中以原子方式更新数据库字段的计数

来自分类Dev

Firebase Cloud Firestore数据库的基本安全规则有不安全的规则

来自分类Dev

如何以编程方式检查SSAS数据库/多维数据集是否正在处理?

来自分类Dev

从数据库中找到数据计数

来自分类Dev

数据库或文件处理

来自分类Dev

数据库或文件处理

来自分类Dev

在 Cloud Firestore 数据库中保存二进制数据安全吗?

来自分类Dev

快速嵌入式数据库

Related 相关文章

  1. 1

    Firebase 数据库安全

  2. 2

    续集(Ruby),如何以安全的方式递增和使用数据库计数器?

  3. 3

    Firebase数据库删除安全规则

  4. 4

    Firebase 实时数据库中需要安全规则吗?

  5. 5

    您可以控制 firebase 实时数据库安全规则中的各个属性吗?

  6. 6

    为产品变体设计数据库的最佳方式

  7. 7

    从Firebase数据库检索数据并快速进行操作

  8. 8

    我可以在Symfony2中以编程方式访问数据库查询计数器吗

  9. 9

    Azure - 应用服务 - 移动应用快速入门 - 连接数据库

  10. 10

    快速查询firebase数据库的中间部分

  11. 11

    快速从firebase数据库中读取子值

  12. 12

    SQL数据库触发线程安全吗?

  13. 13

    存储mysql数据库连接安全吗?

  14. 14

    数据库中具有属性的Firebase安全规则

  15. 15

    Firebase /数据库-版本2安全规则?

  16. 16

    用于查询的Firebase Realtime数据库安全规则

  17. 17

    Firebase数据库安全规则块发布

  18. 18

    新用户的 Firebase 数据库安全

  19. 19

    从数据库获取每月统计数据的优雅方式(没有动态 SQL)?

  20. 20

    如何安全地实现Facebook登录和设计数据库?

  21. 21

    如何安全地实现Facebook登录和设计数据库?

  22. 22

    在多线程环境中以原子方式更新数据库字段的计数

  23. 23

    Firebase Cloud Firestore数据库的基本安全规则有不安全的规则

  24. 24

    如何以编程方式检查SSAS数据库/多维数据集是否正在处理?

  25. 25

    从数据库中找到数据计数

  26. 26

    数据库或文件处理

  27. 27

    数据库或文件处理

  28. 28

    在 Cloud Firestore 数据库中保存二进制数据安全吗?

  29. 29

    快速嵌入式数据库

热门标签

归档