Ist die Art und Weise, wie die Firebase-Datenbank Quickstart-Handles zählt, sicher?

Ich möchte ein Inkrement-Feld für Artikel erstellen.

Ich beziehe mich auf diesen Link: https://firebase.google.com/docs/database/android/save-data#save_data_as_transactions

  • So erstellen Sie einen Nummernauswahl-Dialog?
  • Wie man Text in einem TextView mit Compound Drawable vertikal ausstellt
  • Testen von Geofencing mit Google Play Services 6.5
  • Android ListView Adapter notifyDataSetInvalidated () vs notifyDataSetChanged ()
  • Was bedeutet 'SRPy' in der Mockito Dokumentation
  • Aapt.exe hat aufgehört zu arbeiten
  • Im Beispiel gibt es Code für Inkrement-Feld:

    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); } 

    Aber wie kann ich sicher sein, wenn der Benutzer den Artikel schon mochte / nicht mochte?

    Im Beispiel könnte der Benutzer (Hacker) genauso gut klären ganze Sterne Karte so und es wird sowieso sparen:

     p.stars = new HashMap<>(); 

    Und es wird die Logik für andere Benutzer ruinieren, die es schon mochten.

    Ich glaube nicht einmal, dass Sie Regeln dafür machen können, vor allem für "Abnahme zählen" Aktion.

    Irgendeine Hilfe, Vorschläge?

  • Kann nicht dex2jar auf meinem mac verwenden: permission denied
  • Was ist der Standardpfad von debug.keystore auf Mac?
  • NullPointerException in handleOnGetSentenceSuggestionsMultiple (SpellCheckerSession)
  • Erhalten Sie den Anwendungskontext, der Null zurückgibt
  • Wie kann ich wissen, welche Version von ADT wir in eclipse verwenden?
  • Menüpunkte werden nicht in der Aktionsleiste angezeigt
  • One Solution collect form web for “Ist die Art und Weise, wie die Firebase-Datenbank Quickstart-Handles zählt, sicher?”

    Die Sicherheitsregeln können ein paar Dinge machen:

    • uid sicher, dass ein Benutzer nur eine eigene uid zum uid hinzufügen / entfernen kann

       "stars": { "$uid": { ".write": "$uid == auth.uid" } } 
    • starCount Sie sicher, dass ein Benutzer nur die starCount ändern starCount wenn sie ihre eigene uid dem starCount hinzufügen oder von dort entfernen

    • starCount sicher, dass der Benutzer starCount um 1 erhöhen / verringern starCount

    Auch mit diesen könnte es ja noch schwierig sein, eine Sicherheitsregel zu haben, die sicherstellt, dass der starCount gleich der Anzahl der Uids im starCount ist. Ich ermutige Sie, es zu versuchen, aber, und teilen Sie Ihr Ergebnis.

    Die Art, wie ich die meisten Entwickler gesehen habe, beschäftigt sich damit:

    • Mache den Start auf dem Client (wenn die Größe des Sternknotens nicht zu groß ist, ist das vernünftig).
    • Haben einen vertrauenswürdigen Prozess auf einem Server, der die stars in starCount . Es könnte child_added / child_removed Ereignisse zum Inkrementieren / Dekrementieren verwenden.

    Update: mit Arbeitsbeispiel

    Ich habe ein Arbeitsbeispiel für ein Wahlsystem geschrieben. Die Datenstruktur ist:

     votes: { uid1: true, uid2: true, }, voteCount: 2 

    Wenn ein Benutzer stimmt, sendet die App ein Multi-Location-Update:

     { "/votes/uid3": true, "voteCount": 3 } 

    Und dann um ihre Stimme zu entfernen:

     { "/votes/uid3": null, "voteCount": 2 } 

    Dies bedeutet, dass die App explizit den aktuellen Wert für voteCount lesen voteCount , mit:

     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); }); } 

    Es ist im Wesentlichen eine Multi-Location-Transaktion, aber dann in App-Code und Sicherheitsregeln anstelle von Firebase SDK und Server selbst eingebaut.

    Die Sicherheitsregeln machen ein paar Dinge:

    1. Sicherstellen, dass die StimmeCount nur um 1 gehen kann
    2. Sicherstellen, dass ein Benutzer nur eine eigene Stimme hinzufügen / entfernen kann
    3. Sicherstellen, dass eine Zählhöhe von einer Abstimmung begleitet wird
    4. Sicherstellen, dass ein Zählungsabfall von einem "Unendlichen" begleitet wird
    5. Sicherstellen, dass eine Abstimmung von einer Zunahme begleitet wird

    Beachten Sie, dass die Regeln nicht:

    • Sicherstellen, dass ein "Unendliches" von einer Zählabnahme begleitet wird (kann mit einer .write Regel durchgeführt werden)
    • Wiederholen fehlgeschlagene Stimmen / unvotes (zur gleichzeitigen Abstimmung / Nicht-

    Die Regeln:

     "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 mit etwas Code, um dies zu testen: http://jsbin.com/yaxexe/edit?js,console

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.