Zapisuj licznik na bieżąco - i wymuszaj walidację. Zhakowałem to razem - za liczenie unikalnych głosów i zliczeń, które wciąż rosną !. Ale tym razem przetestowałem swoją sugestię! (niezależnie od błędów wycinania / wklejania!).
„Sztuczka” polega na tym, aby użyć priorytetu węzła jako liczby głosów ...
Dane to:
głosuj / $ issueBeingVotedOn / user / $ uniqueIdOfVoter = thisVotesCount, priority = thisVotesCount głos / $ issueBeingVotedOn / count = 'user /' + $ idOfLastVoter, priority = CountofLastVote
,"vote": {
".read" : true
,".write" : true
,"$issue" : {
"user" : {
"$user" : {
".validate" : "!data.exists() &&
newData.val()==data.parent().parent().child('count').getPriority()+1 &&
newData.val()==newData.GetPriority()"
użytkownik może głosować tylko raz && liczba musi być o jeden wyższa niż bieżąca liczba, a wartość danych musi być taka sama jak priorytet.
}
}
,"count" : {
".validate" : "data.parent().child(newData.val()).val()==newData.getPriority() &&
newData.getPriority()==data.getPriority()+1 "
}
count (tak naprawdę ostatni wyborca) - głos musi istnieć, a jego liczba musi być równa nowej liczbie, && newcount (priorytet) może wzrosnąć tylko o jeden.
}
}
Skrypt testowy dodający 10 głosów od różnych użytkowników (w tym przykładzie fałszywy identyfikator, jeśli użytkownik auth.uid powinien być w środowisku produkcyjnym). Odlicz do (i--) 10, aby zobaczyć, że walidacja nie powiodła się.
<script src='https://cdn.firebase.com/v0/firebase.js'></script>
<script>
window.fb = new Firebase('https:...vote/iss1/');
window.fb.child('count').once('value', function (dss) {
votes = dss.getPriority();
for (var i=1;i<10;i++) vote(dss,i+votes);
} );
function vote(dss,count)
{
var user='user/zz' + count; // replace with auth.id or whatever
window.fb.child(user).setWithPriority(count,count);
window.fb.child('count').setWithPriority(user,count);
}
</script>
„Ryzyko” polega na tym, że głos został oddany, ale licznik nie został zaktualizowany (hakerstwo lub błąd skryptu). Dlatego głosy mają unikalny `` priorytet '' - skrypt powinien naprawdę zaczynać się od upewnienia się, że nie ma głosowania z priorytetem wyższym niż bieżąca liczba, jeśli tak, należy zakończyć tę transakcję przed wykonaniem własnego - spraw, aby klienci wyczyścili do ciebie :)
Licznik musi zostać zainicjowany z priorytetem przed rozpoczęciem - forge nie pozwala na to, więc potrzebny jest skrypt zastępczy (zanim walidacja będzie aktywna!).