क्या क्रॉस-डोमेन AJAX अनुरोध करने का एक सुरक्षित तरीका है?


83

कॉर्स (क्रॉस-ओरिजिनल रिसोर्स शेयरिंग) के बारे में पढ़ने के बाद, मुझे समझ नहीं आया कि यह सुरक्षा को कैसे बेहतर बनाता है। यदि सही ORIGIN हेडर भेजा गया है तो क्रॉस-डोमेन AJAX संचार की अनुमति है। एक उदाहरण के रूप में, अगर मैं भेजता हूं

मूल: http://example.com

सर्वर जाँचता है कि क्या यह डोमेन श्वेत सूची में है और यदि यह हैडर, तो:

प्रवेश-नियंत्रण-अनुमति-उत्पत्ति: [यहाँ url प्राप्त किया]

प्रतिक्रिया के साथ वापस भेज दिया जाता है (यह सरल मामला है, पहले से अनुरोध किए गए अनुरोध भी हैं, लेकिन सवाल वही है)।

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


पढ़ें यह उत्तर किसी के लिए स्पष्ट नहीं है कि समान-मूल नीति और CORS क्या हैं और वे क्यों मौजूद हैं: stackoverflow.com/a/27294846/3340994
nishantbhardwaj2002

जवाबों:


54

आप एक वेब ब्राउज़र में जावास्क्रिप्ट के साथ एक ओरिजिनल हेडर को नकली नहीं कर सकते। कोर कि रोकने के लिए बनाया गया है।

एक वेब ब्राउज़र के बाहर, यह कोई फर्क नहीं पड़ता। यह लोगों को मिलने वाले डेटा को रोकने के लिए डिज़ाइन नहीं किया गया है। आप इसे बिना सदस्यों के जनता के सामने नहीं ला सकते।

इसे इस प्रकार बनाया गया है कि इसे दिया जाए:

  • ऐलिस, एक व्यक्ति जो एक एपीआई प्रदान करता है जिसे अजाक्स के माध्यम से एक्सेस करने के लिए डिज़ाइन किया गया है
  • बॉब, वेब ब्राउज़र वाला व्यक्ति
  • चार्ली, अपनी खुद की वेबसाइट चलाने वाली एक तीसरी पार्टी है

यदि बॉब चार्ली की वेबसाइट पर जाता है, तो चार्ली जेएस को बॉब के ब्राउज़र में नहीं भेज सकता है ताकि वह एलिस की वेबसाइट से डेटा प्राप्त कर सके और चार्ली को भेज सके।

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

यदि आप अनधिकृत लोगों को डेटा देखने से रोकना चाहते हैं, तो आपको इसे पासवर्ड, एसएसएल क्लाइंट सेर्ट या पहचान-आधारित प्रमाणीकरण / प्राधिकरण के कुछ अन्य माध्यमों से बचाने की आवश्यकता है।


1
मूल रूप से कॉर्स या क्रॉस-ऑरिजनल रिसोर्स शेयरिंग और ऑथराइजेशन दो अलग-अलग चीजें हैं। जैसा कि वर्णन से पता चलता है कि यह वास्तव में क्रॉस ओरिजनल शेयरिंग को बढ़ाने के लिए है। क्या कोई ग्राहक वास्तव में ऐसा करने की अनुमति देता है यह निर्धारित करने के लिए आपके प्राधिकरण तर्क के लिए है।
रीपर_ऑनिक

150

इसे रोकने का उद्देश्य है -

  • आप वेबसाइट X पर जाएं
  • वेबसाइट X के लेखक ने एक बुरी स्क्रिप्ट लिखी है जो आपके ब्राउज़र को भेजी जाती है
  • स्क्रिप्ट अपने बैंक की वेबसाइट पर आपके ब्राउज़र लॉग पर चल रहा है और बुराई सामान करता है और क्योंकि यह चल रहा है कि के रूप में आप अपने ब्राउज़र में ऐसा करने की अनुमति नहीं है।

विचार यह है कि आपके बैंक की वेबसाइट को आपके ब्राउज़र को बताने के लिए किसी तरह की आवश्यकता है यदि वेबसाइट एक्स पर स्क्रिप्ट आपके बैंक में पृष्ठों तक पहुंचने के लिए विश्वसनीय होनी चाहिए।


9
आपका उत्तर बहुत स्पष्ट था, धन्यवाद। मैं अपडाउन नहीं करता क्योंकि इसके लिए 15 प्रतिष्ठा की आवश्यकता होती है।
जिब्रियन २००१

तो, CORS वेबसाइट X पर ऐप की अखंडता की रक्षा नहीं कर रहा है, यह BANK की अखंडता की रक्षा कर रहा है, जो कहता है कि वेब X को BANK में API कॉल करने के लिए विश्वसनीय माना जाना है?
luigi7up

7
@ luigi7up: नहीं, कोर कुछ भी सुरक्षा नहीं करता है, वास्तव में यह एसओपी के अपवादों को परिभाषित करके सुरक्षा को "कमजोर" करता है। Access-Control-Allow-Originहैडर निर्दिष्ट करता है जो मूल (में निर्दिष्ट Originहेडर) संसाधन का उपयोग करने की अनुमति है। आम तौर पर केवल एक ही मूल के साथ अनुरोधों को ऐसा करने की अनुमति दी जाएगी। यहां सबसे महत्वपूर्ण हिस्सा है: अनुमति / इनकार BROWSER द्वारा लागू किया जाता है, सर्वर नहीं। इसका मतलब है कि Access-Control-Allow-Originआपके ब्राउज़र की सुरक्षा करता है, न कि सर्वर या सर्वर पर मौजूद संसाधन।
डेनियल एफ।

वेबसाइट X के लेखक को आपकी साइटों के बैकएंड के माध्यम से बैंक में प्रवेश करने से रोकता है जो तब प्रॉक्सी के रूप में उपयोग किया जाएगा? यह सिर्फ एक अतिरिक्त परत है जिसे उसे बनाना होगा, लेकिन यह कॉर्स मुद्दे को पूरी तरह से दरकिनार कर देगा, जो मुझे लगता है कि ब्राउज़र में होगा .. तो यह एक ब्राउज़र की तरह लगता है-केवल सुरक्षा जो मुझे बहुत व्यर्थ लगता है अगर आप इसके चारों ओर जा सकते हैं बहुत ही सरल तरीके से ..
tkit

1
@pootzko: आपके परिदृश्य में दुर्भावनापूर्ण वेबसाइट X में बैंकिंग वेबसाइट के लिए मान्य सत्र नहीं होगा। यहां तक ​​कि अगर पीड़ित अपने बैंकिंग में लॉग इन करता है (उदाहरण के लिए दूसरे टैब में), दुर्भावनापूर्ण साइट एक्स के पास उस सत्र तक पहुंच नहीं होगी, क्योंकि ब्राउज़र द्वारा लागू की गई कुकी नीति: ब्राउज़र कभी भी सत्र की कुकी नहीं भेजेगा बैंक की वेबसाइट X पर
daniel f।

68

बस @jcoder के उत्तर को जोड़ने के लिए, Originहेडर का पूरा बिंदु सर्वर पर अनुरोधित संसाधनों की सुरक्षा के लिए नहीं है। यह कार्य सर्वर पर ही अन्य माध्यमों से होता है, क्योंकि एक हमलावर वास्तव में इस हेडर को उचित टूल्स के साथ खराब कर सकता है।

Originहेडर का बिंदु उपयोगकर्ता की सुरक्षा करना है। परिदृश्य निम्न है:

  • एक हमलावर एक दुर्भावनापूर्ण वेबसाइट M बनाता है

  • एक उपयोगकर्ता ऐलिस को M से कनेक्ट करने के लिए छल किया जाता है, जिसमें एक स्क्रिप्ट होती है जो सर्वर B पर कॉर्स के माध्यम से कुछ क्रियाओं को करने की कोशिश करती है जो SS का समर्थन करती है

  • B के Access-Control-Allow-Originहेडर में शायद M नहीं होगा , इसका कारण यह होगा?

  • निर्णायक बिंदु यह है कि Originहेडर को खराब करने या अधिलेखित करने के लिए एम का कोई मतलब नहीं है , क्योंकि अनुरोध ऐलिस के ब्राउज़र द्वारा शुरू किए गए हैं। तो उसका ब्राउज़र OriginM को सेट (सही) करेगा, जो Access-Control-Allow-OriginB के नहीं है, इसलिए अनुरोध विफल हो जाएगा।

ऐलिस Originहेडर को स्वयं बदल सकता है, लेकिन वह क्यों करेगा, क्योंकि इसका मतलब होगा कि वह खुद को नुकसान पहुंचा रहा है?

TL; DR: Originशीर्ष लेख निर्दोष उपयोगकर्ता की सुरक्षा करता है। यह एक सर्वर पर संसाधनों को सुरक्षित नहीं करता है। यह किसी हमलावर द्वारा अपनी मशीन पर खराब किया जाता है, लेकिन यह मशीन पर उसके नियंत्रण के तहत नहीं खराब हो सकता है।

सर्वर को अभी भी अपने संसाधनों की रक्षा करनी चाहिए, क्योंकि मिलान Originहेडर का अर्थ अधिकृत एक्सेस नहीं है। हालाँकि, Originशीर्ष लेख जो मेल नहीं खाता है, का अर्थ है अनधिकृत पहुँच।


11
बहुत अच्छा जवाब। सबसे अच्छा एक समग्र IMHO।
पीटर

यह चुना हुआ जवाब क्यों नहीं था? यह स्पष्ट रूप से सबसे अच्छा है। इस उत्तर में उल्लिखित चौथा बिंदु वह है जो पोस्टर वास्तव में पूछ रहा है।
अलबौदी

सबसे अच्छा जवाब डैनियल। यह कोर्स का पूरा बिंदु है: "निर्णायक बिंदु यह है कि एम के पास ओरिजिनल हेडर को स्पूफ करने या ओवरराइट करने का कोई साधन नहीं है, क्योंकि एलिस के ब्राउज़र द्वारा अनुरोध शुरू किए जाते हैं। इसलिए उसका ब्राउज़र एम को सही (मूल) सेट करेगा। B के Access-Control-Allow-Origin में नहीं है, इसलिए अनुरोध विफल हो जाएगा। ”
लुकास लुकाक

14

समान मूल नीति का उद्देश्य आम तौर पर लोगों को वेबसाइट सामग्री तक पहुंचने से रोकना नहीं है; अगर कोई ऐसा करना चाहता है, तो उन्हें ब्राउज़र की भी आवश्यकता नहीं है। मुद्दा यह है कि क्लाइंट स्क्रिप्ट को आवश्यक एक्सेस अधिकारों के बिना किसी अन्य डोमेन पर सामग्री तक पहुंचने से रोका जाए। वही मूल नीति के लिए विकिपीडिया प्रविष्टि देखें ।


2
"बिंदु क्लाइंट स्क्रिप्ट को किसी अन्य डोमेन पर सामग्री तक पहुंचने से रोकने के लिए है" यह समान उत्पत्ति नीति के साथ हल किया गया था। नहीं? मेरा मतलब है कि मेरी वेबसाइट आपको कुछ जेएस भेजती है और आपका ब्राउज़र कुछ अन्य डोमेन को अजाक्स कॉल की अनुमति नहीं देगा। वही मूल नीति है। CORS बहुत अधिक उपयोग कर रहा है - मेरे अजाक्स को अन्य डोमेन तक पहुंचने की अनुमति देता है। मुझे यहाँ कुछ भारी याद आ रहा है :)
luigi7up

@ luigi7up करने के लिए: हाँ, CORS विरोध करता है। यह एक वेब साइट के मालिक को एक से अधिक विश्वसनीय डोमेन से अपनी सेवाओं तक पहुंच प्रदान करने की अनुमति देता है।
सर्गेई जूल 2'15

6

कॉर्स के बारे में पढ़ने के बाद, मुझे समझ नहीं आया कि यह सुरक्षा में सुधार कैसे करता है।

कॉर्स सुरक्षा में सुधार नहीं करता है। कॉर्स सर्वरों को यह बताने के लिए एक तंत्र प्रदान करता है कि उन्हें विदेशी डोमेन द्वारा कैसे एक्सेस किया जाना चाहिए, और यह ऐसा करने की कोशिश करता है जो ब्राउज़र सुरक्षा मॉडल के अनुरूप है जो कॉर्स (अर्थात् समान उत्पत्ति नीति ) से पहले मौजूद था ।

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

एक उदाहरण लेते हैं। एक उपयोगकर्ता Aकुकी के माध्यम से साइट पर लॉग इन होता है । उपयोगकर्ता भार दुर्भावनापूर्ण साइट Mहै, जो एक रूप है कि एक करता सबमिट करने का प्रयास POSTकरने के लिए A। क्या होगा? ठीक है, कोर के साथ या बिना, और Mएक अनुमति के डोमेन के साथ या बिना , ब्राउज़र Aउपयोगकर्ता के प्राधिकरण कुकी के साथ अनुरोध भेजेगा , और सर्वर दुर्भावनापूर्ण POSTरूप से निष्पादित करेगा जैसे कि उपयोगकर्ता ने इसे शुरू किया था।

इस हमले को क्रॉस-साइट रिक्वेस्ट फॉरेरी कहा जाता है , और कॉर्स खुद इसे कम करने के लिए कुछ नहीं करता है। इसलिए यदि आप उपयोगकर्ताओं की ओर से डेटा बदलने के अनुरोधों को अनुमति देते हैं तो CSRF सुरक्षा बहुत महत्वपूर्ण है।

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

संक्षेप में, CORS मौजूदा समान उत्पत्ति नीति सुरक्षा मॉडल को अन्य स्वीकृत डोमेन में विस्तारित करने के लिए एक उपयोगी विनिर्देश है। यह सुरक्षा को नहीं जोड़ता है, और साइटों को उसी प्रकार के रक्षा तंत्र की आवश्यकता होती है जो उन्होंने CORS से पहले किए थे।


1

मुझे उत्तर देने में देर हो रही है लेकिन मुझे नहीं लगता कि यहां कोई भी पोस्ट वास्तव में मांगे गए उत्तर प्रदान करता है। सबसे बड़ा तरीका यह होना चाहिए कि ब्राउज़र वह एजेंट है जो originहेडर मान लिख रहा है । एक दुष्ट स्क्रिप्ट originहेडर मान नहीं लिख सकती है । जब सर्वर Access-Control-Allow-Originहेडर के साथ वापस प्रतिक्रिया करता है, तो ब्राउज़र यह सुनिश्चित करने की कोशिश करता है कि इस हेडर में originपहले भेजा गया मूल्य है। यदि नहीं, तो यह एक त्रुटि को ट्रिगर करता है और वापस मांग वाले स्क्रिप्ट पर मान वापस नहीं करता है। इस प्रश्न के अन्य उत्तर एक अच्छा परिदृश्य प्रस्तुत करते हैं जब आप एक उत्तर को बुरी लिपि में अस्वीकार करना चाहेंगे।

@daniel f भी सवाल का एक अच्छा जवाब प्रदान करता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.