हमारे वेब एप्लिकेशन में हमने उस स्थिति में भाग लिया है जहां हमें एक डोमेन से एक क्रॉस-डोमेन 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 का उपयोग करने के लिए कोई सुरक्षा जोखिम नहीं है जिसे हम भरोसा करते हैं। क्या यह एक सटीक मूल्यांकन है?
समाधान
तो दोनों सिरों पर भरोसा कर रहे हैं, वहाँ JSONP में कोई खतरा नहीं है (यह मूल रूप से सिर्फ एक
<script>
टैग है) है।दोनों स्क्रिप्ट/JSONP समान सुरक्षा भेद्यताएं रखते हैं क्योंकि उन्हें डेटा के रूप में संचारित करने के बजाय स्वचालित रूप से निष्पादित किया जाता है। सर्वर-साइड प्रॉक्सी का उपयोग करना मतलब है कि क्रॉस-डोमेन रिटर्न डेटा के रूप में पास किया जाता है और दुर्भावनापूर्ण सामग्री के लिए फ़िल्टर किया जा सकता है। यदि क्रॉस-डोमेन पूरी तरह भरोसेमंद है, तो JSONP/SCRIPT सुरक्षित है, यदि जोखिम का कोई संदेह है तो उसे फ़िल्टर प्रॉक्सी के माध्यम से पास करें।
आपको 'fopen' का उपयोग करके प्रॉक्सी सर्वर बनाने की आवश्यकता नहीं है। आप अन्य डोमेन से अनुरोधों को पूरा करने के लिए अपाचे के 'mod_proxy' का भी उपयोग कर सकते हैं। –