2011-06-10 20 views
26

सुरक्षित करना यह शायद एक सामान्य सुरक्षा प्रश्न है, लेकिन मैंने सोचा कि मैं जो विकास कर रहा हूं उसके क्षेत्र में पूछूंगा।वेब सेवाएं एपीआई कुंजी और अजाक्स - कुंजी

परिदृश्य है: एक वेब सेवा (डब्ल्यूसीएफ वेब एपीआई) जो एपीआई कुंजी का उपयोग करती है और मुझे बताती है कि उपयोगकर्ता कौन है, और फ्रंट एंड पर jQuery और एप्लिकेशन का मिश्रण।

एक ओर, यातायात https हो सकता है, इसलिए इसका निरीक्षण नहीं किया जा सकता है, लेकिन यदि मैं प्रति उपयोगकर्ता एक ही कुंजी (एक guid कहता हूं) का उपयोग करता हूं, और मैं इसे दोनों में उपयोग कर रहा हूं तो यह मौका लिया जा सकता है और कोई उपयोगकर्ता का प्रतिरूपण कर सकता है।

यदि मैं ओएथ के समान कुछ लागू करता हूं, तो उपयोगकर्ता और प्रति-ऐप कुंजी उत्पन्न होती है, और यह काम कर सकती है - लेकिन अभी भी jQuery पक्ष के लिए मुझे जावास्क्रिप्ट में एप एपीआई कुंजी की आवश्यकता होगी।

यह केवल एक समस्या होगी यदि कोई वास्तविक कंप्यूटर पर था और दृश्य-स्रोत था।

मुझे क्या करना चाहिए?

  1. md5 या किसी भी तरह कुंजी को एन्क्रिप्ट करें?
  2. कुंजी को एक चर चर में रखें, फिर AJAX का उपयोग करते समय इसे पुनर्प्राप्त करें?
  3. इसे प्राप्त करें, यह एक बड़ा सौदा/समस्या नहीं है।

मुझे यकीन है कि यह शायद एक आम समस्या है - इसलिए किसी भी पॉइंटर्स का स्वागत होगा।

इस स्पष्ट बनाने के - यह मेरा एपीआई मैं लिखा है कि मैं एक गूगल के खिलाफ की क्वेरी कर रहा हूँ, नहीं, आदि तो मैं सत्र टोकन प्रति क्या कर सकते हैं, आदि, मैं तो बस सबसे अच्छा बाहर काम करने के कोशिश कर रहा हूँ है क्लाइंट साइड टोकन/चाबियाँ जिन्हें मैं उपयोग करूंगा सुरक्षित करने का तरीका।

मैं यहां थोड़ा अधिक सतर्क हूं, लेकिन सीखने के लिए इसका उपयोग कर रहा हूं।

+1

मेरा वोट # 2 के लिए होगा। –

+0

मेरा वोट नंबर 2 पर भी जाएगा, मानते हैं कि टोकन की समाप्ति भी है। –

उत्तर

0
+2

यह मुझे बताता है कि एपीआई कुंजी का उपयोग/कार्यान्वयन कैसे करें, लेकिन इसे सुरक्षित करने के प्रश्न का उत्तर नहीं देता है। – crucible

2
आम तौर पर इस तरह के मामलों में

(.NET 4 में आराम सेवाओं के लिए एपीआई कुंजी सत्यापन कैसे करना है) हालांकि सर्वर के माध्यम से आप प्रॉक्सी अनुरोध 'AJAX' जो ब्राउज़र बनाने की पुष्टि करता है का उपयोग करते हुए अनुरोध ऐसा करने के लिए अधिकृत है। यदि आप सीधे जावास्क्रिप्ट से सेवा को कॉल करना चाहते हैं, तो आपको JSON Web Tokens (JWT) जैसे किसी प्रकार की टोकन सिस्टम की आवश्यकता है और यदि सेवा वर्तमान डोमेन के अलावा कहीं और स्थित है तो आपको क्रॉस-डोमेन समस्याओं को काम करना होगा।

2

एपीआई के साथ संचार को संभालने वाले सर्वर साइड कोड को कॉल करने के लिए jQuery का उपयोग करने के बारे में। यदि आप एमवीसी का उपयोग कर रहे हैं तो आप एक नियंत्रक कार्रवाई को कॉल कर सकते हैं जिसमें आपकी सेवा को हिट करने के लिए कोड और एपीआई कुंजी हो सकती है और आपके यूएक्स में आंशिक दृश्य (या यहां तक ​​कि जेएसओएन) भी लौटा सकता है। यदि आप वेब फॉर्म का उपयोग कर रहे हैं तो आप एक एएसपीएक्स पेज बना सकते हैं जो कोड के पीछे एपीआई संचार करेगा और फिर आपके यूएक्स के उपभोग के लिए प्रतिक्रिया स्ट्रीम में सामग्री लिख देगा। फिर आपके यूएक्स कोड में आपके सर्वर साइड कोड में कुछ $। पोस्ट() या $ .load() कॉल हो सकते हैं और आपकी एपीआई कुंजी और एंडपॉइंट दोनों सुरक्षित हो जाएंगे।

+1

मुझे अभी भी यह बताने का कोई तरीका प्रदान करने की आवश्यकता है कि वह व्यक्ति कौन है और इसकी पुष्टि करता है, जिसे शायद अभी भी टोकन की आवश्यकता होगी? – crucible

+0

@ जस्टिन-schwartzenberger और वहाँ हर किसी के बारे में क्या है जो मेरे सर्वर साइड कोड तक पहुंच सकता है? तकनीकी रूप से, वे सुरक्षित संसाधनों तक पहुंच प्राप्त करते हैं, जब तक कि मैं अपने सर्वर पक्ष को केवल उसी डोमेन से निष्पादित करने की रक्षा नहीं करता – preslavrachev

7

यह इस बात पर निर्भर करता है कि एपीआई कुंजी का उपयोग कैसे किया जाता है। Google द्वारा प्रदान की गई एपीआई कुंजी अनुरोध की उत्पत्ति वाली साइट के यूआरएल से बंधी हुई हैं; यदि आप किसी वैकल्पिक URL के साथ किसी साइट पर कुंजी का प्रयास करते हैं और उपयोग करते हैं तो सेवा क्लाइंट पक्ष की कुंजी को सुरक्षित रखने की आवश्यकता को हटाकर इस प्रकार फेंकती है और त्रुटि होती है।

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

मेरी समग्र सिफारिश हालांकि वेब एपीआई पर प्रतिबंधों को लागू करने के लिए किया जाएगा कि चाबियों का उपयोग कैसे किया जा सकता है और इस प्रकार ग्राहक पर उनकी रक्षा करने की कोशिश करने की जटिलताओं और आवश्यकता को हटा देता है।

18

पहले (मैं इस पोस्ट "सुरक्षा"। टैगिंग का सुझाव देते हैं), तुम क्या आप के खिलाफ की रक्षा कर रहे हैं के बारे में स्पष्ट होना चाहिए। क्या आप क्लाइंट पर भरोसा कर सकते हैं? एक चालाक उपयोगकर्ता आपके पृष्ठ पर एक Greasemonkey स्क्रिप्ट चिपक सकता है और वास्तव में वह कोड कॉल कर सकता है जिसे आपका यूआई अनुरोध भेजने के लिए कहता है। जावास्क्रिप्ट बंद करने में सब कुछ छिपाना मतलब है कि आपको डीबगर की आवश्यकता है; यह हमले को असंभव नहीं बनाता है। फायरबग HTTPS अनुरोधों का पता लगा सकता है। एक समझौता क्लाइंट पर भी विचार करें: क्या एक कीलॉगर स्थापित है? क्या पूरी प्रणाली गुप्त रूप से वर्चुअलाइज्ड चल रही है ताकि कोई हमलावर किसी भी समय अपने अवकाश में स्मृति के किसी हिस्से का निरीक्षण कर सके? जब आप वेबपैप के रूप में उजागर होते हैं तो सुरक्षा वास्तव में मुश्किल होती है।

  1. वास्तव में कुंजियों का उपयोग नहीं करने पर विचार करें बल्कि HMAC की हेश, उदाहरण के लिए, एक टोकन आप प्रमाणीकरण के तुरंत बाद ही दे:

    बहरहाल, यहाँ कुछ चीजें आप पर विचार करने के लिए कर रहे हैं।

  2. डोम स्टोरेज कुकीज से पोक करने के लिए थोड़ा कठिन हो सकता है।

  3. उदाहरण सुरक्षा मॉडल के लिए Google's implementation of OAuth 2 पर एक नज़र डालें। असल में आप टोकन का उपयोग करते हैं जो केवल सीमित समय के लिए मान्य होते हैं (और शायद एक ही आईपी पते के लिए)। इस तरह यदि टोकन को अवरुद्ध या क्लोन किया जाता है, तो यह केवल थोड़े समय के लिए मान्य है। बेशक आपको टोकन खत्म होने पर क्या करना है इसके बारे में सावधान रहना होगा; क्या हमलावर सिर्फ वही काम कर सकता है जो आपका कोड करता है और एक नया वैध टोकन प्राप्त करता है?

नहीं उपेक्षा सर्वर साइड सुरक्षा कार्य करें: भले ही अपने ग्राहक अनुरोध सबमिट करने से पहले जाँच की जाना चाहिए था, सर्वर पर फिर से जाँच करता है, तो उपयोगकर्ता वास्तव में वे क्या कह रहे हैं ऐसा करने की अनुमति नहीं है। वास्तव में, यह सलाह उपर्युक्त में से अधिकांश को रोक सकती है।

+0

बिल्कुल, वहां पर प्रतिबंध होगा और प्रत्येक उपयोगकर्ता सर्वर की ओर से क्या कर सकता है, और लॉगिंग कर सकता है, लेकिन मैं चाहता था यह सुनिश्चित करने के लिए कि वह व्यक्ति जो सर्वर को बताता है वह व्यक्ति भ्रष्टाचार के लिए खुला नहीं है। – crucible

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