2009-03-05 9 views
57

वहाँ किसी भी सुरक्षा के मुद्दों है कि जब JSONP का उपयोग कर विचार किया जाना चाहिए रहे हैं?क्या JSONP उपयोग करने के लिए सुरक्षित है?

+0

साइट वास्तव में एक है सुरक्षित साइट..मैं सिर्फ यह जानना चाहता हूं कि मेरे सर्वर द्वारा संग्रहीत कुकी के साथ कोई सुरक्षा समस्या है या नहीं। –

+0

नाउगुर द्वारा नीचे दिया गया लिंक एक अच्छा समाधान और एक अंतर्दृष्टिपूर्ण स्पष्टीकरण देता है कि इसे कैसे टूटा जा सकता है और समाधान कैसे काम करता है। कृपया एक नज़र डालें। – minghua

+0

मुद्दों को ठीक करने के लिए संबंधित प्रश्न: [क्या एक सुरक्षित JSONP अनुरोध करना संभव है?] (Http://stackoverflow.com/q/16660145/1048572) – Bergi

उत्तर

61

अद्यतन: JSONP क्रॉस-डोमेन अनुरोध करने के लिए एक आम हैक है। आधुनिक ब्राउज़रों में अब क्रॉस ओरिजिनल रिसोर्स शेयरिंग है, और आईई 8 + में XDomainRequest है जो समान है। अधिक जानकारी के लिए http://enable-cors.org/ देखें।

JSONP सिर्फ एक स्क्रिप्ट शामिल है कि आप एक कॉलबैक उपयोग करने के लिए अनुमति देता है। हालांकि आपको Cross-site request forgery (CSRF) से अवगत होना चाहिए।

जब तक आप स्क्रिप्ट और सर्वर पर नियंत्रण के रूप में, JSONP अब और असुरक्षित की तुलना में एक स्क्रिप्ट शामिल नहीं है। जब तक आपके पास JSONP-service नहीं है जो उपयोगकर्ताओं में लॉग इन करने के लिए संवेदनशील डेटा देता है। एक दुर्भावनापूर्ण साइट सेवा के लिए अनुरोध भेज सकती है (उम्मीद है कि उपयोगकर्ता आपकी साइट पर लॉग इन है), और डेटा को पुनः प्राप्त करें। सेवा अनुरोध के संदर्भकर्ता की जांच कर सकती है, लेकिन फ़्लैश (धन्यवाद क्रिस मोस्चिनी) का उपयोग कर रेफरर को धोखा देना संभव है। - अपने इंटरनेट बैंकिंग खाते में एक उपयोगकर्ता के लॉग :

इस senario कल्पना कीजिए। उपयोगकर्ता ब्राउज़र में सत्र कुकी संग्रह करना। इस साइट पर उपयोगकर्ता और उसके खातों के बारे में संवेदनशील जानकारी के साथ एक jsonp सेवा है। - अन्य साइटों को पता नहीं है कि उपयोगकर्ता के प्रवेश, लेकिन वे एक जंगली अनुमान कर सकता है और jsonp सेवा का उपयोग करने का प्रयास करें। चूंकि उपयोगकर्ता के पास सत्र कुकी है, ब्राउज़र को एक प्रतिक्रिया मिलेगी, और साइट को अपने सर्वर पर संवेदनशील डेटा को सहेजने के लिए एजेक्स पोस्ट करने से रोकने के लिए कुछ भी नहीं है।

जून 28 वें अद्यतन 2012: http://erlend.oftedal.no/blog/?blogid=130

+2

यह कहीं और बताया गया है कि HTTP_REFERER फ़्लैश के साथ धोखा दिया जा सकता है, इसलिए जेसनपी पर सर्वर द्वारा प्रदान किए जाने वाले किसी भी संवेदनशील डेटा को कमजोर है। –

+0

यह जोखिम का केवल एक पक्ष है। नाउगुरूर का लिंक जोखिम के दूसरे पक्ष को दिखाता है, और उस हिस्से के लिए बेहतर समाधान दिखाता है। – minghua

21

हाँ, आप सावधान रहना चाहिए, लेकिन जब साथ ठीक से इस्तेमाल किया: क्या आप एक सुरक्षा विशेषज्ञ द्वारा गहराई ब्लॉग पोस्ट में इस पढ़ना चाहिए हमलों CSRF के खिलाफ की रक्षा करना चाहते हैं भरोसेमंद सेवाएं यह अपेक्षाकृत सुरक्षित है।

यहाँ, JSONP के साथ सुरक्षा मुद्दों का एक सारांश है के रूप में मैं इसे समझ:

उपभोक्ता के दृष्टिकोण से:

  • आप प्रदाता पर विश्वास करना चाहिए दुर्भावनापूर्ण जावास्क्रिप्ट वापस नहीं करने के लिए उम्मीद JSON लिपटे के बजाय जेएसओएनपी कॉलबैक में आप निर्दिष्ट करते हैं।
  • एक ही भी किसी भी तीसरे पक्ष जावास्क्रिप्ट Google Analytics जैसे एम्बेडेड ऐड-ऑन, का सच है।
  • यह केवल एक्सएसएस हमलों के समान है जिसमें यह तीसरे पक्ष को आपके आवेदन में मनमानी जावास्क्रिप्ट निष्पादित करने की अनुमति देता है, हालांकि, आपको पहले स्थान पर अनुरोध करके तीसरे पक्ष पर विश्वास करना होगा।

प्रदाता के दृष्टिकोण से:

  • आप मान नहीं होना चाहिए कि भले ही ग्राहकों को 'कुकी (रों) अनुरोध है कि उपभोक्ता अपने नियंत्रण में एक वेबपेज है में मौजूद हैं। अधिकृत यूआरएल की श्वेतसूची के खिलाफ रेफरर हेडर की जांच करें, और/या कुकी-आधारित प्रमाणीकरण पर भरोसा न करें।
  • एक सीएसआरएफ/भ्रमित डिप्टी हमले के लिए अनुनासिक।
12

दोनों पक्षों के लिए सुरक्षा समस्याएं हैं। जेएसओएनपी सहित साइट के लिए सबसे गंभीर है।

यदि आप किसी अन्य डोमेन से (जिसमें आप नियंत्रण नहीं करते हैं) शामिल हैं, तो वह डोमेन किसी भी समय स्क्रिप्ट को बदल सकता है। वे जावास्क्रिप्ट को अपने वेबपृष्ठ के संदर्भ में कुछ भी कर सकते हैं, कि आपका स्वयं का जावास्क्रिप्ट कर सकता है। यदि आप JSONP का उपयोग करते हैं तो इसके चारों ओर कोई रास्ता नहीं है। आपको iframes का उपयोग करके क्रॉस-डोमेन संचार में देखना चाहिए, जो उत्कृष्ट EasyDXM लाइब्रेरी द्वारा सबसे अच्छा किया जाता है।

यदि आप JSONP को संभालने वाली एक webservice की पेशकश कर रहे हैं, तो आपको क्रॉस-साइट अनुरोध फोर्जरी (सीएसआरएफ) से रक्षा करना होगा। यह वह जगह है जहां आपका webservice लॉग-इन उपयोगकर्ताओं को संवेदनशील जानकारी देता है। यदि कोई उपयोगकर्ता आपकी साइट में लॉग इन हो गया है, तो कोई अन्य साइट JSONP सेवा के लिए एक GET अनुरोध उत्पन्न कर सकती है, और आपके डोमेन की कुकीज़ अनुरोध के साथ सबमिट की जाती है - संक्षेप में, लॉग-इन उपयोगकर्ता को प्रमाणित करना - सिवाय इसके कि रिमोट डोमेन प्रतिक्रिया प्राप्त करता है और संवेदनशील डेटा को पढ़ने में सक्षम है!

सीएसआरएफ के खिलाफ सुरक्षा का सबसे अच्छा तरीका एक गैर (एक अनुमान लगाने के लिए, यादृच्छिक रूप से जेनरेट किया गया नंबर) उत्पन्न करना और सत्र में इसे स्टोर करना है। अपने वेबपृष्ठों पर अपने सभी रूपों में यह नॉन आउटपुट करें, और इसे अपने पृष्ठों पर सभी JSONP अनुरोधों में शामिल करें। सर्वर पर, सुनिश्चित करें कि अनुरोध में मौजूद नहीं है और सही है (चाहे वह एक GET, POST, आदि हो) अन्य डोमेन इस गैर-अनुमान लगाने में असमर्थ होंगे, और इस प्रकार कुकीज़ के बावजूद संवेदनशील जानकारी प्राप्त करने में असमर्थ होंगे भेजा जाना।

अंत में, एक और प्रकार की सुरक्षा समस्या है: JSONP ब्राउज़र में उपयोगकर्ता प्रमाणीकरण का समर्थन नहीं करता है, ओएथ के साथ संभव है। आप निश्चित रूप से, सर्वर को किसी प्रकार का एक्सेस टोकन (जैसे ओएथ के साथ) प्राप्त कर सकते हैं और इसका उपयोग कर सकते हैं। हालांकि, यदि आप पूरी तरह से ब्राउज़र में प्रमाणीकरण करना चाहते हैं, तो आपको iFrames के साथ क्रॉस-डोमेन संचार का उपयोग करना होगा। मुझे लगता है कि ओएथ 2.0 यह कैसे करता है। यहां बताया गया है कि आप इसे कैसे सेट अप करते हैं: आपकी साइट पर होस्ट किए गए पृष्ठों के पास आपके सर्वर पर पूर्ण पहुंच है। एक जावास्क्रिप्ट लाइब्रेरी है जो EasyDXM लोड करती है और आपकी साइट पर एक छिपी हुई आईफ्रेम सेट करने के लिए इसका उपयोग करती है, और इसका उपयोग करके उससे बात करें।

2

समाधान! उपाय!

मुझे यह सोचा गया कि एक आईफ्रेम क्रॉसडोमेन हैक है जो आने वाले कोड को निष्पादित नहीं करता है, लेकिन आपको एक चर पारित करने देता है। सुरक्षा के लिए चारों ओर लपेटने के लिए इसका इस्तेमाल क्यों न करें? ...

और हाँ, किसी को हमेशा की तरह :)

http://beebole.com/blog/general/sandbox-your-cross-domain-jsonp-to-improve-mashup-security/

के रूप में पहली बार इस विचार आया, और वहाँ भी window.postMessage है, जो सुरक्षित और hacky नहीं है

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