2017-10-20 125 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。