2016-02-01 6 views
5

मैं सिर्फ इतना है कि Meteor.call देखा, अवधारणा है कि आह्वान संग्रह का सम्मिलित करें, अद्यतन से उपयोगकर्ता को रोकने, विधि, JavaScript कंसोल से लागू किया जा करने में सक्षम को दूर अभी भी।जावास्क्रिप्ट कंसोल से 'Meteor.call' को आमंत्रित करने से कैसे रोकें?

ग्राहक के उदाहरण के लिए:

// client 
... 

Meteor.call('insertProduct', productInfo); 

... 

यहाँ सर्वर हिस्सा है:

// server 
Meteor.methods({ 
    insertProduct: function(productInfo){ 
     Product.insert(...); 
    } 
}) 

ठीक है, मुझे पता है लोगों को अपने JavaScript कंसोल से सीधे Product.insert (आह्वान नहीं कर सकता)।

लेकिन अगर वे थोड़ा और अधिक प्रयास करते हैं, वे यह पता लगाने चाहते हैं Meteor.call() डेवलपर उपकरण के संसाधन टैब से ग्राहक की जावास्क्रिप्ट में है।

तो अब वे अपने कंसोल से Meteor.call को आमंत्रित करने का प्रयास कर सकते हैं, फिर यह अनुमान लगाने का प्रयास करें कि productInfo के गुण क्या होना चाहिए।

तो मुझे आश्चर्य है कि कैसे हम इस अंतिम गतिविधि को रोकने कर सकते हैं? क्या Meteor.call नौकरी अच्छी तरह से किया है? या मुझे कुछ महत्वपूर्ण याद आ रहा है?

+1

कुछ भी नहीं है, * कुछ नहीं *, एक जावास्क्रिप्ट प्रोग्राम ऐसा कर सकता है जिसे आप कंसोल में दोहराना नहीं कर सकते। *कुछ भी तो नहीं*। करने के लिए एकमात्र चीज सर्वरसाइड पर एयरटाइट सत्यापन है, ताकि केवल उन्हीं चीजों को आप पार करने की उम्मीद कर सकें। – Amadan

+0

भी, यदि यह अमादन की टिप्पणी से अभी तक स्पष्ट नहीं है, तो हाँ उपयोगकर्ता * कंसोल से 'product.insert() 'को कॉल कर सकते हैं। तो आपको यह सुनिश्चित करने की ज़रूरत है कि आपके पास सर्वर पर नियमों को सही अनुमति/अस्वीकार कर दिया गया है (और 'असुरक्षित' पैकेज को हटा दिया है)। –

+0

इसमें कुछ भी गलत नहीं है। वेब पर प्रत्येक एप्लिकेशन में कुछ प्रकार का 'मीटर.call' होता है, आमतौर पर यह कुछ यूआरएल के लिए सिर्फ एक अजाक्स कॉल है, इसलिए आप कंसोल खोल सकते हैं और AJAX कॉल कर सकते हैं, यह ठीक है। बस ग्राहक पर भरोसा मत करो। – imkost

उत्तर

2

Meteor.call एक वैश्विक समारोह, बस window.alert() की तरह है। दुर्भाग्यवश, Meteor.call को कॉल करने वाले उपयोगकर्ता को रोकने से आप कुछ भी नहीं कर सकते हैं। हालांकि, आप डेटा की स्कीमा और उपयोगकर्ता जो भेज रहे हैं उसके वास्तविक डेटा को सत्यापित कर सकते हैं। मैं यह सुनिश्चित करने के लिए https://github.com/aldeed/meteor-simple-schema (aldeed: उल्का पैकेज नाम के रूप में सरल-स्कीमा) की सिफारिश करता हूं ताकि आपको अपनी परियोजना में कचरा डेटा न मिले।

0

आप कंसोल से Meteor.call को अवरुद्ध नहीं कर सकते हैं, जैसे कि आप कंसोल से CollectionName.find().count() को अवरुद्ध नहीं कर सकते हैं। ये उल्का में वैश्विक कार्य हैं।

लेकिन वहाँ सरल कदम आप अपने तरीकों को सुरक्षित करने के लिए ले जा सकते हैं।

  1. अपने संग्रह को स्वीकार करने वाले डेटा के प्रकार सेट करने के लिए aldeed:simple-schema का उपयोग करें। यह आपको विशिष्ट कुंजी है कि अपने संग्रह उनके प्रकार (स्ट्रिंग, बूलियन, सरणी, वस्तु, पूर्णांक) https://github.com/aldeed/meteor-simple-schema
  2. सुनिश्चित करें कि केवल उन में लॉग इन अपने विधि से अद्यतन कर सकते हैं और साथ ही ले जाता है स्थापित करने के लिए अनुमति देगा। या वैश्विक अनुमति/अस्वीकार नियम सेट करें। https://www.meteor.com/tutorials/blaze/security-with-methods & & https://www.discovermeteor.com/blog/allow-deny-a-security-primer/
  3. निकालें संकुल insecure और autopublish

स्कीमा के सरल कॉम्बो और अनुमति देते हैं/आप ठीक करना चाहिए इंकार करते हैं।

0

आप अब तक जानते हैं कि तुम सच में Javascript कंसोल, मैं @Stephen साथ और कहा कि @thatgibbyguy एक सुझाव के रूप में जोड़ना चाहते हैं क्या से Meteor.call बुला ब्लॉक नहीं कर सकते हैं, अपने उपयोगकर्ता का role को जोड़ते समय दस्तावेजों की जांच करते रहें संग्रह में Simple-Schema आपको संग्रह में कचरा डेटा डालने/अपडेट करने में मदद करेगा। और alanning:roles पैकेज निश्चित रूप से आपके ऐप को सुरक्षित रखता है जिसके पास आपके संग्रह दस्तावेज़ लिखने/पढ़ने/अपडेट करने की अनुमति है।

Alanning:roles Package

1

@Faysal द्वारा mentionned रूप में, आप सुनिश्चित करने के लिए अपने कॉल कानूनी हैं कई तरीके हैं।

Meteor.methods({ 
    methodName: function() { 
     if (!Roles.userIsInRole(this.userId, 'admin')) { 
      throw new Meteor.Error(403, 'not authorized); 
     } else { yourcode }); 

इस तरह, केवल व्यवस्थापक उपयोगकर्ताओं विधि कॉल कर सकते हैं: ऐसा करने के लिए एक आसान कदम alanning:roles को लागू करने और निम्नलिखित की तरह अपने विधि के भीतर से भूमिका जांच कर रहा है।

ध्यान दें कि आप विधि के भीतर से this.connection भी देख सकते हैं और यह निर्धारित कर सकते हैं कि कॉल सर्वर से आता है (this.connection === false) या ग्राहक से।

आम तौर पर, अपने तरीकों से चेक और डेटा मैनिप्लेशंस करना एक अच्छा तरीका है। अनुमति दें/अस्वीकार करना शुरू करने के लिए अच्छा है लेकिन जब आपके संग्रह भारी हो जाते हैं और आपके किनारे-मामलों का विस्तार होता है तो बनाए रखना वास्तव में कठिन हो जाता है।

2

जैसा कि अन्य ने बताया, "Meteor.call" निश्चित रूप से कंसोल से उपयोग किया जा सकता है। यहां सूक्ष्म मुद्दा यह है कि एक उल्का ऐप का कानूनी उपयोगकर्ता हो सकता है जो बदले में सर्वर पर बुरी चीजें कर सकता है। इसलिए यदि कोई उपयोगकर्ता कानूनी है, तो उपयोगकर्ता कानूनी है, तो यह स्वयं गारंटी नहीं देता है कि डेटा सुरक्षित है।

यह केवल उल्का के साथ एक मुद्दा नहीं है। मुझे लगता है कि इस तरह के सभी क्षुधा

एक Iife में अपने मॉड्यूल लपेटें संभावित Iife (तुरंत लागू समारोह अभिव्यक्ति) का उपयोग करके भी कानूनी उपयोगकर्ताओं के माध्यम से, अपने डेटा की भ्रष्टाचार के खिलाफ की रक्षा के लिए इस तरह के भ्रष्टाचार की रक्षा के लिए

एक तरीका यह है की आवश्यकता होगी । बंद करने के अंदर एक निजी चर रखें जो एक अद्वितीय एक बार उपयोग कुंजी (के 1) स्टोर करता है। उस कुंजी को किसी अन्य मार्ग का उपयोग करके वहां रखा जाना चाहिए - शायद यह सुनिश्चित करके कि स्टार्टअप पर क्लाइंट में संग्रह पर्यवेक्षक को निकाल दिया जाए। कोई भी यहां अन्य रणनीतियों का उपयोग कर सकता है। विचार सर्वर से के 1 के मूल्य में गिलहरी करना है और इसे एक निजी चर में

फिर प्रत्येक बार जब आप अपने कोड के अंदर से Meteor.call का आह्वान करते हैं, तो पैरामीटर में से एक के रूप में के 1 पास करें। बदले में सर्वर जांचता है कि क्या के 1 वास्तव में उस ब्राउज़र कनेक्शन के लिए कानूनी था

चूंकि आईआईएफई द्वारा बंद किए गए बंद होने पर के 1 को एक निजी चर के अंदर संग्रहीत किया गया था, ब्राउज़र कंसोल में किसी के लिए यह निर्धारित करना मुश्किल होगा के 1 का मूल्य। इसलिए, भले ही "Meteor.call" को ब्राउज़र कंसोल से बुलाया जा सकता है, इससे कोई नुकसान नहीं होगा। यह दृष्टिकोण डेटा भ्रष्टाचार के लिए काफी अच्छा निवारक होना चाहिए

संबंधित मुद्दे