gpt4 book ai didi

android - Firebase 数据库快速入门处理计数的方式是否安全?

转载 作者:IT老高 更新时间:2023-10-28 23:31:23 25 4
gpt4 key购买 nike

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

我指的是这个链接: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<>();

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

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

有什么帮助、建议吗?

最佳答案

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

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

    "stars": {
    "$uid": {
    ".write": "$uid == auth.uid"
    }
    }
  • 确保用户只有在将自己的 uid 添加到 stars 节点或删除它时才能更改 starCount从那里

  • 确保用户只能将 starCount 增加/减少 1

即使有这些,要确保 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

关于android - Firebase 数据库快速入门处理计数的方式是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37954217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com