我有第二个问题。
我在基于Firebase数据库的JS中创建了一个网站。我的一段代码创建了一个点系统。使用函数“set”代码在数据库中创建包含获得点数的行“点”(默认为0)。当用户做“某个动作”时,我想将它们的数量增加1。在数据库规则中,我添加了一行,允许从“点”添加和获取值仅授权帐户。
嗯..
如果有人复制了我的代码,将添加1点代码更改为添加2000点代码并在授权后粘贴它会发生什么情况。然后他将在他的本地主机上打开网站,用他的电子邮件和pw授权... 或者他甚至会使用该代码进行浏览器扩展。 他会得到2000分以上吗?那么如何修复,隐藏或者......我好奇这么久,我找不到答案。在MySQL中它更简单。
答案 0 :(得分:1)
您可以为几乎任何场景编写安全规则。
如果您只想允许增量为1,则简单的基础是:
".validate": "newData.val() = data.val() + 1"
如果您希望他们能够添加或减去1:
".validate": "(newData.val() === data.val() + 1) ||
(newData.val() === data.val() - 1)"
如果您想确保用户只能通过添加或减去1:
来修改自己的分数"scores": {
"$uid": {
".write": "auth.uid === $uid"
".validate": "(newData.val() === data.val() + 1) ||
(newData.val() === data.val() - 1)"
}
}
不断。我见过的一些最先进的场景是用于验证国际象棋游戏动作的规则(我现在无法找到它们,因此不确定它们是否曾在Firebase之外发布)和rules for a item trading in a multiplayer game。
答案 1 :(得分:0)
问题在于数据结构,您不希望允许每个用户直接添加点,因为这将是可滥用的。您必须允许用户声明他们给出了一个观点或采取了一个观点然后函数必须增加点数。 这应该是您的数据库结构:
{
"objectsWithPoints":{
"object1": {
"attribute": "the value",
"points": 2
}
"pointsForObjects":{
"object1": {
"uid1":true,
"uid2": true
}
}
}
为安全起见,您需要编写的规则允许用户只在pointsForObjects
节点内编写自己的对象:
"pointsForObjects": {
"$objectId": {
"$uid": {
".write": "auth.uid === $uid",
".read": "auth.uid === $uid"
}
}
}
通过这种方式,用户可以说*"我给出了一个观点,或者我提出了一个观点" *如果没有数据,如果有数据允许,在UI中允许用户给出一个点给用户在ui中取下一点。
最后,要更新必须使用函数设置侦听器的点,只要在pointsForObjects
节点中写入每个属于该对象的内容,并将计数设置为该对象。
这样,黑客是否会尝试编写"uid: false
或"uid": 1
,因为您正在计算孩子数量。任何黑客都不能添加多个孩子,因为它会被覆盖,因为密钥是相同的,只能是uid。