บันทึกการนับเมื่อคุณไป - และใช้การตรวจสอบความถูกต้องเพื่อบังคับใช้ ฉันแฮ็คสิ่งนี้เข้าด้วยกัน - เพื่อเก็บคะแนนโหวตที่ไม่ซ้ำกันและจำนวนที่จะมา! แต่คราวนี้ฉันได้ทดสอบคำแนะนำของฉันแล้ว! (แม้ว่าจะมีข้อผิดพลาดในการตัด / วาง!)
'เคล็ดลับ' ในที่นี้คือการใช้ลำดับความสำคัญของโหนดเพื่อนับคะแนน ...
ข้อมูลคือ:
โหวต / $ issueBeingVotedOn / user / $ uniqueIdOfVoter = thisVotesCount ลำดับความสำคัญ = thisVotesCount โหวต / $ issueBeingVotedOn / count = 'user /' + $ idOfLastVoter ลำดับความสำคัญ = 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()"
ผู้ใช้สามารถลงคะแนนได้เพียงครั้งเดียวเท่านั้น && จำนวนต้องสูงกว่าค่าข้อมูลจำนวน && ปัจจุบันหนึ่งค่าต้องเท่ากับลำดับความสำคัญ
}
}
,"count" : {
".validate" : "data.parent().child(newData.val()).val()==newData.getPriority() &&
newData.getPriority()==data.getPriority()+1 "
}
การนับ (ผู้มีสิทธิเลือกตั้งคนสุดท้ายจริงๆ) - การลงคะแนนจะต้องมีอยู่และการนับจำนวนใหม่เท่ากับจำนวนใหม่ && จำนวนใหม่ (ลำดับความสำคัญ) จะเพิ่มขึ้นได้เพียงหนึ่ง
}
}
สคริปต์ทดสอบเพื่อเพิ่มการโหวต 10 ครั้งโดยผู้ใช้ที่แตกต่างกัน (สำหรับตัวอย่างนี้การปลอมแปลงรหัสควรให้ผู้ใช้ auth.uid ในการผลิต) นับถอยหลังด้วย (i--) 10 เพื่อดูว่าการตรวจสอบล้มเหลว
<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>
'ความเสี่ยง' ในที่นี้คือการลงคะแนน แต่การนับไม่ได้รับการอัปเดต (haking หรือ script ล้มเหลว) นี่คือเหตุผลที่การโหวตมี 'ลำดับความสำคัญ' ที่ไม่ซ้ำกัน - สคริปต์ควรเริ่มต้นด้วยการตรวจสอบให้แน่ใจว่าไม่มีการโหวตที่มีลำดับความสำคัญสูงกว่าจำนวนปัจจุบันหากมีควรทำธุรกรรมนั้นให้เสร็จสิ้นก่อนที่จะดำเนินการเอง - ให้ลูกค้าของคุณทำความสะอาด ขึ้นสำหรับคุณ :)
การนับจะต้องเริ่มต้นด้วยลำดับความสำคัญก่อนที่คุณจะเริ่ม - forge ไม่อนุญาตให้คุณทำเช่นนี้ดังนั้นจึงจำเป็นต้องมีสคริปต์ต้นขั้ว (ก่อนที่การตรวจสอบจะทำงาน!)