2017-10-20 41 views
-3

J'ai une deuxième question pour vous. Je crée un site Web en JS basé sur la base de données Firebase. Une partie de mon code crée un système de points. Avec la fonction "set", le code crée une ligne "points" dans la base de données qui contient le nombre de points obtenus (par défaut 0). Je veux augmenter le nombre d'entre eux par 1 quand l'utilisateur a fait "quelques actions". Dans les règles de base de données, je mets une ligne qui permet d'ajouter et d'obtenir des valeurs de "points" uniquement aux comptes autorisés.Protection de la base de données Firebase à partir de points ajoutant des hackers

Eh bien ..

ce qui se passerait si quelqu'un copié le code de moi, a changé ajouter du code-1 point à ajouter du code-2000 points et collé juste après autorisation. Puis il ouvrira le site sur son localhost, autorisera avec son email et pw ... Ou il va même faire une extension Browser avec ce code. Aurait-il 2000 points de plus ???

Alors, comment réparer cela, cacher ou sth. Je me demande depuis si longtemps et je ne peux pas trouver la réponse. En MySQL, c'était plus simple.

+0

Pourquoi suis-je encore minuscule ... Je me suis habitué xD – Hubert13888

+1

(Je ne suis pas un downvoter ici) Un excellent moyen d'empêcher les downvotes est de montrer ce que vous avez déjà essayé. Montrez quelles règles vous avez créées et comment le hacker dans vos peurs pourrait aller à l'encontre de ces règles. –

Répondre

1

Vous pouvez écrire des règles de sécurité pour pratiquement tous les scénarios.

Si vous voulez seulement permettre incréments de 1, la base est simple:

".validate": "newData.val() = data.val() + 1" 

Si vous voulez qu'ils soient en mesure d'ajouter ou de soustraire 1:

".validate": "(newData.val() === data.val() + 1) || 
       (newData.val() === data.val() - 1)" 

Si vous voulez s'assurer que l'utilisateur ne peut modifier leur propre score en ajoutant ou en soustrayant 1:

"scores": { 
    "$uid": { 
    ".write": "auth.uid === $uid" 
    ".validate": "(newData.val() === data.val() + 1) || 
        (newData.val() === data.val() - 1)" 
    } 
} 

Et ainsi de suite. Certains des scénarios les plus avancés que j'ai vus étaient des règles pour valider des mouvements d'un jeu d'échecs (je ne peux pas les trouver maintenant, donc je ne suis pas sûr qu'ils aient jamais été publiés en dehors de Firebase), et rules for a item trading in a multiplayer game.

+0

Je pense que le code ne protège pas de l'ajout de code avec le script. Je veux dire que quelqu'un authentifié peut tout faire avec la base de données, donc si je donne vos règles, il sera capable de faire un script en ajoutant des points 1: 1// – Hubert13888

+0

Puis-je ajouter quelque chose à firebase en utilisant PHP? Ce serait le moyen le plus sûr (j'utilise le framework symfony). – Hubert13888

+0

J'ai trouvé https://github.com/kreait/firebase-php mais je ne sais pas où je peux obtenir google-service-account.json de – Hubert13888

0

Le problème est la structure de données, vous ne voulez pas permettre à chaque utilisateur d'ajouter directement des points car cela sera abusif. Vous devez autoriser les utilisateurs à état qu'ils ont donné un point ou prendre un point et puis les fonctions doivent augmenter les points. Cela devrait être la structure de votre base de données:

{ 
    "objectsWithPoints":{ 
    "object1": { 
    "attribute": "the value", 
    "points": 2 
    } 
    "pointsForObjects":{ 
    "object1": { 
     "uid1":true, 
     "uid2": true 
    } 
    } 
} 

Ce que vous devez faire pour la sécurité est d'écrire des règles qui permettent à l'utilisateur que d'écrire leur propre objet à l'intérieur du noeud pointsForObjects:

"pointsForObjects": { 
    "$objectId": { 
     "$uid": { 
       ".write": "auth.uid === $uid", 
       ".read": "auth.uid === $uid" 
     } 
    } 
} 

De cette façon l'utilisateur peut dire * "Je donne un point ou je prends un point" * s'il n'y a pas de données, permettez à l'utilisateur de donner un point s'il y a des données permettant à l'utilisateur dans l'ui de prendre un point .

Enfin, pour mettre à jour les points que vous devez définir un écouteur à l'aide des fonctions, chaque fois que quelque chose est écrit dans le nœud pointsForObjects comptent chacun appartenant à l'objet et définissez le nombre à l'objet.

De cette façon, il n'y a pas de problème si un hacker essaie d'écrire "uid: false, ou "uid": 1, parce que vous comptez les enfants. Et n'importe quel hacker ne peut pas ajouter plus d'un enfant car il sera écrasé puisque la clé est la même et ne peut être que l'uid.