2016-05-12 9 views
0

Ich habe ein sehr einfaches Abfrageskript geschrieben, das Stimmen in eine Firebase-Datenbank speichert. Um mehrere Abstimmungen durch denselben Benutzer zu verhindern, speichere ich E-Mails an ein separates Objekt und überprüfe danach, bevor ein neuer Eintrag platziert werden kann (dieses Ding ist für meine eigenen Informationen und muss keine hohe Sicherheit sein).gibt es einen Weg in Firebase, um Schreibvorgänge in schneller Folge zu verhindern?

Bis jetzt scheint es zu verhindern, dass grundlegende Foul Play, aber ich bekomme viele Instanzen von mehreren Stimmen in schneller Folge (wahrscheinlich schneller, als der Browser neu laden könnte). Im schlimmsten Fall gab es 16 Stimmen in Millisekunden.

Gibt es eine Möglichkeit, diese schnellen Nachfolge-Schreibvorgänge in Firebase oder auf der JavaScript-Seite zu verhindern?

Firebase Daten:

{ 
    "votes" : { 
    " obj1 " : { 
     "-KHXPWtcxzXhs2ULBE1Q" : { 
     "name" : " name1 ", 
     "email" : "email1", 
     "timestamp" : 1463013744297 
     }, 
     "-KHXPWuyhTg6S3Qcw4e9" : { 
     "name" : " name1 ", 
     "email" : "email1", 
     "timestamp" : 1463013744382 
     } 
    }, 
    "obj2" : { 
     "-KHZ20CRiT5fs6H4Nhel" : { 
     "name" : "name2", 
     "email" : "email2", 
     "timestamp" : 1463041135613 
     } 
    }, 
    }, 
    "email" : { 
    "-KHXPWtHSNYWBmvXsmNx" : { 
     "email" : "email1", 
     "timestamp" : 1463013744292 
    }, 
    "-KHXPWus4hSwi1t00Gq_" : { 
     "email" : "email1", 
     "timestamp" : 1463013744377 
    }, 
    "-KHZ20CdfcsoGjvn98Q" : { 
     "email" : "email2", 
     "timestamp" : 1463041135606 
    }, 
    } 
} 

Die jQuery:

 var validateEmail = /^[A-Z0-9._%+-][email protected]([A-Z0-9-]+\.)+[A-Z]{2,4}$/i; 

     function castVote() { 

      var ref = new Firebase('firebaseurl'); 

      $(".notification.exists").hide(); 
      $(".notification.valid").hide(); 

      var obj = $('#obj').val().toLowerCase(); 
      var email = $('#email').val().toLowerCase(); 

      var emailref = ref.child("email"); 

      if (validateEmail.test(email)){ 
      emailref.once('value', function(snapshot) { 
       var exists = false; 
       snapshot.forEach(function(childSnapshot){ 
        if(email === childSnapshot.val().email){ 
         exists = true;  
        } 
       }) 

       if (exists){ 
        $(".notification.exists").show(); 
       } 
       else{ 
        write(obj,email,ref,emailref); 
       } 
      }); 
      } 
      else{ 
      $(".notification.valid").show(); 
      } 
     } 


     function write(obj,email,ref,emailref){ 

      var objref = ref.child("obj/" + obj); 

      //save email 
      emailref.push().set({ 
       email:email, 
       "timestamp": Firebase.ServerValue.TIMESTAMP 
      }); 

      //save vote 
      objref.push().set({ 
       obj: obj, 
       "email": email, 
       "timestamp": Firebase.ServerValue.TIMESTAMP 
      }); 

      //clear fields 
      $('#obj').val(''); 
      $('#email').val(''); 
     } 

     } 
+0

Wenn Sie 'write' aufrufen, prüfen Sie ein Cooldown-Flag und' return', falls true, setzen Sie das Cooldown-Flag, 'setTimeout', um es zu deaktivieren. – SparK

Antwort

5

Sie sollten Sicherheitsregeln bei Firebase Ende verhindern. Eine einfache Regel, die einen Benutzer neu Abstimmung verhindert sein könnte -

Beachten Sie, dass diese Schnipsel benötigen würden in Ihrer Sicherheitsregel an der richtigen Stelle setzen -

"votes" : { 
    // keep .read/.write as applicable 
    "$obj" : { 
     "$user" : { 
      // keep .read/.write as applicable 
      // Don't allow write if the parent obj already contains this user entry 
      ".validate" : "!data.parent().hasChild($user)" 
     } 
    } 
} 

Auf diese Weise, wenn Sie eingefügt haben die Abstimmung eines Benutzers in votes für eine bestimmte obj, eine andere Einfügung wird fehlschlagen.

+1

Da ich Ihren vollständigen JSON nicht kenne, kann ich Ihnen mit der genauen Sicherheitsregel nicht helfen. Wenn Sie JSON aus Firebase exportieren und hier einfügen könnten, würde es helfen. – hazardous

+0

die Json s oben. Das Problem mit diesem Ansatz ist, dass, wo Sie $ Benutzer unter Obj haben, verwende ich Push und daher eindeutige Schlüssel, nicht verifizierbare Benutzer. –

+0

Können Sie die E-Mail selbst als eindeutige Schlüssel verwenden? – hazardous

Verwandte Themen