2010-08-31 10 views
8

हमारे वेब एप्लिकेशन में हमने उस स्थिति में भाग लिया है जहां हमें एक डोमेन से एक क्रॉस-डोमेन AJAX कॉल करने की आवश्यकता है, हम पूरी तरह से किसी दूसरे डोमेन पर नियंत्रण करते हैं जिसे हम पूरी तरह से नियंत्रित करते हैं। मैं सबसे अच्छे समाधान के लिए चारों ओर सर्फिंग कर रहा हूं और जो दो दिमाग में आते हैं वे एक स्थानीय फ़ाइल प्रॉक्सी (php :: fopen का उपयोग कर स्थानीय फ़ाइल) या jquery/JSONP हैं।क्रॉस डोमेन JSONP संचार के जोखिम क्या हैं?

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

क्रॉस डोमेन JSONP द्वारा खोले जाने वाले हमले के विशिष्ट वैक्टर क्या हैं? वे दुर्भावनापूर्ण बदल सकता है यही कारण है कि:

मेरी समझ से JSONP के लिए केवल वेक्टर ठीक उसी वेक्टर जो आपकी साइट जिसका src किसी भी साइट है कि आप द्वारा नियंत्रित नहीं है करने के लिए है पर एक <script> टैग शामिल करके खोल दिया है और खेती उपयोगकर्ता सत्र/कुकीज़/डेटा शुरू करें। यदि यह सत्य है, तो ऐसा लगता है कि यह प्रोटोकॉल (JSONP) नहीं है जो चिंता का विषय है, बल्कि स्रोत है कि डेटा एकत्रित किया गया है।

क्योंकि यह सर्वर-साइड प्रॉक्सी था, <script> टैग, या AJAX/JSONP जोखिम यह है कि मैं अपने पृष्ठ पर किसी और की सामग्री डाल रहा हूं, और यदि वे बाध्य महसूस करते हैं तो वे कृषि उपयोगकर्ता सत्र शुरू कर सकते हैं एक तरीका यह है कि Google Analytics एक स्क्रिप्ट टैग के माध्यम से क्या करता है)।

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

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

जाहिर है, सर्वर साइड प्रॉक्सी के कुछ फायदे हैं क्योंकि इससे संभावित एक्सएसएस हमलों को लॉगिंग करने जैसी चीजें आसान हो जाएंगी, लेकिन हमले को रोकने के मामले में PHP और जावास्क्रिप्ट दोनों में पर्याप्त उपयोगिताएं होती हैं। कुछ मायनों में, ऐसा लगता है कि जेएसओएनपी वास्तव में एक सरल <script> टैग से अधिक सुरक्षित है क्योंकि कम से कम JSONP के साथ परिणाम एक फ़ंक्शन के माध्यम से गुजरता है जिसका मतलब है कि यह केवल कंबल ट्रस्ट के बजाय कुछ हद तक फ़िल्टर किया गया है, जैसा कि <script> के साथ होता है।

क्या कोई जोखिम है कि मैं याद कर रहा हूं या अनदेखा कर रहा हूं? अगर मैं सही ढंग से समस्या को समझता हूं, तो किसी ऐसे स्रोत की सामग्री को शामिल करने के लिए JSONP का उपयोग करने के लिए कोई सुरक्षा जोखिम नहीं है जिसे हम भरोसा करते हैं। क्या यह एक सटीक मूल्यांकन है?

समाधान

  1. तो दोनों सिरों पर भरोसा कर रहे हैं, वहाँ JSONP में कोई खतरा नहीं है (यह मूल रूप से सिर्फ एक <script> टैग है) है।

  2. दोनों स्क्रिप्ट/JSONP समान सुरक्षा भेद्यताएं रखते हैं क्योंकि उन्हें डेटा के रूप में संचारित करने के बजाय स्वचालित रूप से निष्पादित किया जाता है। सर्वर-साइड प्रॉक्सी का उपयोग करना मतलब है कि क्रॉस-डोमेन रिटर्न डेटा के रूप में पास किया जाता है और दुर्भावनापूर्ण सामग्री के लिए फ़िल्टर किया जा सकता है। यदि क्रॉस-डोमेन पूरी तरह भरोसेमंद है, तो JSONP/SCRIPT सुरक्षित है, यदि जोखिम का कोई संदेह है तो उसे फ़िल्टर प्रॉक्सी के माध्यम से पास करें।

+0

आपको 'fopen' का उपयोग करके प्रॉक्सी सर्वर बनाने की आवश्यकता नहीं है। आप अन्य डोमेन से अनुरोधों को पूरा करने के लिए अपाचे के 'mod_proxy' का भी उपयोग कर सकते हैं। –

उत्तर

1

जब आप अनुरोध के दोनों सिरों पर नियंत्रण, पारंपरिक सुरक्षा JSONP के बारे में चिंता नहीं की सबसे अधिक एक मुद्दा नहीं है।

एक अतिरिक्त समस्या जो आपको मिलेगी वह यह है कि कुछ उपयोगकर्ता सुरक्षा उपाय के रूप में तृतीय-पक्ष स्क्रिप्ट को अवरुद्ध करते हैं। इससे आपके JSONP अनुरोधों को भी अवरुद्ध कर दिया जाएगा। सर्वर-साइड प्रॉक्सी दृष्टिकोण में वह समस्या नहीं है।

6

server-side-proxy और <script>/JSONP के बीच एक बड़ा अंतर है। पहले मामले में, आप डेटा डाउनलोड, बाद में आप डाउनलोड करने और स्वचालित रूप सेकोड

जब आप एक सर्वर साइड-प्रॉक्सी का निर्माण, जावास्क्रिप्ट कोड XmlHttpRequest उपयोग कर सकते हैं डेटा डाउनलोड करने के लिए निष्पादित करें। यह डेटा स्वचालित रूप से निष्पादित नहीं होगा; इसे निष्पादित करने के लिए आपको eval() जैसे स्पष्ट रूप से कुछ बेवकूफ करना होगा। यहां तक ​​कि यदि डेटा प्रारूप JSON है और अन्य सर्वर से समझौता किया गया है और आपके स्वयं के सर्वर-साइड-प्रॉक्सी समझौता नहीं करता है, तो आपके पास अभी भी आपके क्लाइंट कोड उपलब्ध रक्षा की एक पंक्ति है। उदाहरण के लिए, आप safeJSON parser का उपयोग करके JSON को पार्स कर सकते हैं, और दुर्भावनापूर्ण स्क्रिप्ट को अस्वीकार कर सकते हैं।

लेकिन जब आप JSONP या <script> टैग का उपयोग करते हैं, तो आप सीधे किसी और के कोड शामिल कर सकते हैं। चूंकि इसका कोड (और डेटा नहीं), ब्राउज़र आपको स्वचालित रूप से निष्पादित करने या संशोधित करने का अवसर प्रदान किए बिना इसे निष्पादित करता है।

संक्षेप में, सर्वर साइड-प्रॉक्सी आप रक्षा के दो अतिरिक्त लाइनों देता है - दुर्भावनापूर्ण सामग्री के लिए सर्वर पर डेटा का निरीक्षण करने के डेटा जावास्क्रिप्ट में से पहले का निरीक्षण करने के

  • क्षमता

    1. की क्षमता निष्पादन, अगर आपको इसे निष्पादित करने की आवश्यकता है।
  • +0

    आपने एसएस-प्रॉक्सी के लिए दो लाभों का उल्लेख किया है, लेकिन क्या मैं उन दोनों को JSONP की वापसी फ़िल्टर करके नहीं कर सकता? जेएसओएनपी के परिणामों को फ़िल्टर करने के लिए मैं किस तरह से * असमर्थ हूं * मैं एसएस-प्रॉक्सी के साथ कर सकता हूं ... उदाहरण के लिए यदि मैं jQuery का उपयोग करता हूं और कॉलबैक $ .get ("blah.php? Callback =?", फ़ंक्शन (डेटा) {फ़िल्टर (डेटा)}); एसएस-प्रॉक्सी से अलग कैसे है? – Nucleon

    +1

    JSONP से इस 'कॉलबैक ({"कुछ": "डेटा"}) जैसे कुछ वापस करने की उम्मीद है;', जहां कॉलबैक आपके द्वारा निर्दिष्ट फ़ंक्शन नाम है। लेकिन कॉलबैक नाम सिर्फ सम्मेलन है। यदि सर्वर चाहता है, तो यह केवल 'sendCookieToAttacker (document.cookie) लौटा सकता है;' और जो jQuery आप JQuery को पास करते हैं वह कभी निष्पादित नहीं होगा। आप कॉलबैक फ़ंक्शन का आह्वान करने के लिए सर्वर पर भरोसा कर रहे हैं, लेकिन इसकी कोई गारंटी नहीं है कि इसे कॉल किया जाएगा। –

    +0

    उस उदाहरण में एसआरआई, sendCookieToAttacker() को पहले ही परिभाषित करना होगा अन्यथा यह कुछ भी नहीं करेगा, है ना? इसके अलावा, इसे लगातार तरीके से परिभाषित किया जाना चाहिए, अन्यथा यह केवल हैकर्स क्लाइंट को सही करेगा? – Nucleon

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