दिलचस्प पोस्ट
कोणीय जेएस: यूआई-राउटर का प्रयोग करके एक ऑब्जेक्ट को एक राज्य में पास करें एंड्रॉइड में कैसे कैनवास द्वारा सर्कल खींचें? निर्दिष्ट मान य्याय-एमएम-डीडी के लिए आवश्यक प्रारूप के अनुरूप नहीं है आप स्ट्रिंग के भीतर स्ट्रिंग की घटनाओं को कैसे गिना जाएंगे? अलग प्रोग्राम में टेक्स्टबॉक्स को कंसोल आउटपुट रीडायरेक्ट करें चौड़ाई के समान सीएसएस ऊंचाई क्या यह आत्म प्रारंभिक मान्य है? कौन सा संपीड़न (सबसे लोकप्रिय GZIP है) सर्वलेट फ़िल्टर आप सुझाव देंगे? वेब-क्लाइंट अनुरोध के लिए यूजर-एजेंट हेडर सेट करना क्लोज़र में डिबगिंग? SQLite तालिका से स्तंभ हटाएं स्क्रीन चौड़ाई और ऊंचाई प्राप्त करें मैं वर्णानुक्रम में एक सूची कैसे सॉर्ट कर सकता हूँ? क्या मुझे 'एसिंक रिक्त' ईवेंट हैंडलर्स से बचना चाहिए? मुझे जीसीएम सर्वर साइड से "बेमेल सेंडरआईडी" क्यों मिलता है?

जिस तरह से फ़ायरबेज डेटाबेस क्विकस्टार्ट सुरक्षित हैं, वह गिनती सुरक्षित है?

मैं लेख की पसंद के लिए वेतन वृद्धि फ़ील्ड बनाना चाहता हूं

मैं इस लिंक का जिक्र कर रहा हूं: https://firebase.google.com/docs/database/android/save-data#save_data_as_transactions

उदाहरण के लिए वेतन वृद्धि फ़ील्ड के लिए कोड है:

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

लेकिन मैं कैसे सुनिश्चित कर सकता हूं कि उपयोगकर्ता पहले से ही अनुच्छेद पसंद नहीं कर रहा था?

उदाहरण के लिए, उपयोगकर्ता (हैकर) पूरे सितारों को भी इस तरह से साफ़ कर सकता है और यह वैसे भी बचाएगा:

 p.stars = new HashMap<>(); 

और इससे अन्य उपयोगकर्ताओं के तर्क को बर्बाद कर दिया जाएगा जो पहले से ही इसे पसंद कर चुके थे।

मुझे यह भी नहीं लगता है कि आप इसके लिए नियम बना सकते हैं, खासकर "गिनती घटाएं" कार्रवाई के लिए

कोई मदद, सुझाव?

वेब के समाधान से एकत्रित समाधान "जिस तरह से फ़ायरबेज डेटाबेस क्विकस्टार्ट सुरक्षित हैं, वह गिनती सुरक्षित है?"

सुरक्षा नियम कुछ चीजें कर सकते हैं:

  • यह सुनिश्चित करें कि कोई उपयोगकर्ता केवल अपने स्वयं के uid को stars नोड में जोड़ / हटा सकता है

     "stars": { "$uid": { ".write": "$uid == auth.uid" } } 
  • यह सुनिश्चित करें कि उपयोगकर्ता केवल starCount बदल सकता है जब वे अपने नोड को अपने नोड को जोड़ते हैं या वहां से निकाल देते हैं

  • यह सुनिश्चित करें कि उपयोगकर्ता केवल 1 को starCount बढ़ा / घटा starCount है

यहां तक ​​कि इनके साथ, यह एक सुरक्षित नियम रखने के लिए वास्तव में अभी भी मुश्किल हो सकता है जो सुनिश्चित करता है कि starCount stars नोड में starCount की संख्या के बराबर है। मैं आपको यद्यपि प्रयास करने के लिए प्रोत्साहित करता हूं, और अपना परिणाम साझा करता हूं।

जिस तरह से मैं सबसे डेवलपर्स को देखा है I

  • क्लाइंट पर शुरू गिनती करना (यदि stars नोड का आकार बहुत बड़ा नहीं है, तो यह उचित है)।
  • एक ऐसी सर्वर पर चलने वाली एक भरोसेमंद प्रक्रिया है जो stars को stars को starCount । यह बढ़ते / घटते समय के लिए child_added / child_removed ईवेंट का उपयोग कर सकता है।

अपडेट: उदाहरण के साथ काम करना

मैंने एक मतदान प्रणाली का काम उदाहरण लिखा है डेटा संरचना है:

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

जब कोई उपयोगकर्ता वोट करता है, तो ऐप एक मल्टी-स्थान अपडेट भेजता है:

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

और फिर उनका वोट निकालने के लिए:

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

इसका अर्थ है कि ऐप को voteCount लिए वर्तमान मूल्य को स्पष्ट रूप से पढ़ना होगा, साथ में:

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

यह अनिवार्य रूप से एक बहु-स्थान लेनदेन है, लेकिन फिर Firebase SDK और सर्वर के बजाय ऐप कोड और सुरक्षा नियमों में बनाया गया।

सुरक्षा नियम कुछ चीजें करते हैं:

  1. सुनिश्चित करें कि वोटकॉउंट केवल 1 तक ऊपर या नीचे जा सकता है
  2. यह सुनिश्चित करें कि कोई उपयोगकर्ता केवल अपने मत को जोड़ / हटा सकता है
  3. सुनिश्चित करें कि एक गिनती वृद्धि एक वोट के साथ है
  4. सुनिश्चित करें कि गिनती में कमी के साथ "unvote"
  5. सुनिश्चित करें कि एक वोट गिनती वृद्धि के साथ है

ध्यान दें कि नियम नहीं हैं:

  • यह सुनिश्चित करें कि एक "unvote" एक गिनती कमी के साथ (एक .write नियम के साथ किया जा सकता है)
  • पुनः वोटों का असफल वोटों / असुविधा (समवर्ती मतदान / असहमति को संभालने के लिए)

नियम:

 "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: http://jsbin.com/yaxexe/edit?js,console