दिलचस्प पोस्ट
इनलाइन एसवीजी को JPEG / PNG / SVG के रूप में सहेजें तालिका फ़ंक्शन में PostgreSQL पैरामीटर वाला आदेश / सीमा क्या .NET 4 में एक अंतर्निहित JSON serializer / deserializer है? एक पुनरावर्ती वृक्ष बनाने के लिए पंक्तियों को पार करने के लिए MySQL क्वेरी का उपयोग करना जावास्क्रिप्ट के साथ छवि डाउनलोड करें एसक्यूएल चयन की हालिया तारीख से पंक्तियाँ मैं CoffeeScript के लिए Rails 3.1 में "-bare" विकल्प का उपयोग कैसे कर सकता हूं? Sqlite LIMIT / OFFSET क्वेरी WinRT में UI थ्रेड पर कोड चलाएं इनलाइन <शैली> टैग बनाम इनलाइन सीएसएस गुण क्या urllib2 और httplib थ्रेड सुरक्षित हैं? वाई अंक का पेज एक्स अजगर में त्रुटि परिभाषित नहीं है सत्र.आबंदन () और सत्र के बीच अंतर क्या है। क्लीयर () AffineTransform साथ छवि घूर्णन

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

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

मैं इस लिंक का जिक्र कर रहा हूं: 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<>(); 

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

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

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

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

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

  • यह सुनिश्चित करें कि कोई उपयोगकर्ता केवल अपने स्वयं के 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