2017-10-20 124 views
-3

我有第二个问题给你。保护Firebase数据库免遭点黑客攻击

我在基于Firebase数据库的JS中制作网站。我的一段代码创建了一个点系统。使用功能“设置”代码在数据库中创建包含已获取点数(默认为0)的行“点”。当用户进行“某些操作”时,我想将它们的数量增加1。在数据库规则中,我放置了一行允许从“点数”向授权账户添加和获取值。

嗯..

如果有人从我复制的代码,改加1点代码添加-2000-点代码,只是授权后粘贴它会发生什么。然后,他将在他的本地主机上打开该网站,授权他的电子邮件和密码... 或者他甚至会用该代码制作浏览器扩展。 他会多获得2000分吗?

那么如何解决这个问题,隐藏或者某事。我想知道这么久了,我找不到答案。在MySQL中它更简单。

+0

为什么我仍然被贬低......我已经习惯了它xD – Hubert13888

+1

(我不是一个downvoter在这里)防止downvotes一个好方法是显示你已经尝试过。展示您创建的规则以及黑客如何在恐惧中违反这些规则。 –

回答

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

+0

我认为,代码不能保护脚本不添加代码。我的意思是说有人可以用数据库做所有事情,所以如果我给你的规则,他将能够使脚本添加点1:/ – Hubert13888

+0

我能够使用PHP添加一些东西到firebase?这将是最安全的方式(我使用symfony框架)。 – Hubert13888

+0

我发现https://github.com/kreait/firebase-php,但我不知道我在哪里可以从 – Hubert13888

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中取下一个点。

最后,要更新要使用函数设置侦听器的点,只要在pointsForObjects节点计数中写入了每个属于对象的值并将计数设置为该对象。

这样,如果黑客试图编写"uid: false"uid": 1,因为您正在计算孩子,所以没有问题。而且任何黑客都不能添加多个孩子,因为它会被覆盖,因为密钥是相同的,只能是uid。