2012-03-15 16 views
52

मैं एक JSON/REST वेब एपीआई विकसित कर रहा हूं, जिसके लिए मैं विशेष रूप से तृतीय पक्ष वेबसाइटों को AJAX के माध्यम से अपनी सेवा कॉल करने में सक्षम होना चाहता हूं। इसलिए, मेरी सेवा प्रसिद्ध सीओआरएस हेडर भेज रही है:सीओआरएस को सक्षम करने के लिए सुरक्षित कब है?

Access-Control-Allow-Origin: * 

जो तृतीय पक्ष साइटों को AJAX के माध्यम से मेरी सेवा कॉल करने की अनुमति देता है। अब तक सब ठीक है।

हालांकि, मेरे वेब एपीआई का एक उपखंड गैर-सार्वजनिक है और प्रमाणीकरण की आवश्यकता है (ओएथ और एक एक्सेस_टोकन कुकी के साथ सुंदर मानक सामग्री)। क्या यह मेरी साइट के इस हिस्से पर सीओआरएस को सक्षम करना सुरक्षित है?

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

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

तो मेरे सवालों का:

  • यह गैर-सार्वजनिक सामग्री पर CORS सक्षम करने के लिए कभी सुरक्षित है?
  • यदि कोई CORS सक्षम सर्वर कुकी के माध्यम से session_token सेट करता है, तो क्या यह कुकी CORS सर्वर या मुख्य वेब-पेज सर्वर के डोमेन के अंतर्गत सहेजी जाएगी?
+2

ध्यान दें कि आप केवल संसाधनों पर सीओआरएस हेडर भेज सकते हैं जिन्हें आप अन्य मूल से अन्य लोगों तक पहुंचाना चाहते हैं। और आप केवल उन उत्पत्तियों तक सीओआरएस पहुंच को सीमित कर सकते हैं जिनकी आप अपेक्षा करते हैं। –

+1

आदर्श, मैं सभी संसाधनों को किसी भी मूल से सुलभ होना चाहता हूं, अगर सुरक्षा परमिट हो। वैध प्रमाण-पत्र प्रदान करने के लिए यह अभी भी उपयोगकर्ता तक है। मैं बस यह सुनिश्चित करना चाहता हूं कि मैं दुर्भावनापूर्ण वेबसाइटों से क्रॉस-साइट स्क्रिप्टिंग हमलों के लिए दरवाजा नहीं खोल रहा हूं। – Jeroen

उत्तर

29

आपके दूसरे प्रश्न के उत्तर में (यदि कोई CORS सक्षम सर्वर कुकी के माध्यम से session_token सेट करता है ...?), कुकी को CORS सर्वर के डोमेन के अंतर्गत सहेजा जाता है। मुख्य वेब पेज का जेएस कोड कुकी तक नहीं पहुंच सकता है, यहां तक ​​कि document.cookie के माध्यम से भी। कुकी केवल सर्वर पर भेजी जाती है जब .withCredentials प्रॉपर्टी सेट की जाती है, और तब भी, यह केवल तभी स्वीकार किया जाता है जब सर्वर Access-Control-Allow-Credentials शीर्षलेख सेट करता है।

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

अन्त में, आपकी चिंता के चारों ओर अपने CORS आंकड़ों के किसी भी वेबसाइट का उपयोग दे रहा है। इसके खिलाफ सुरक्षा के लिए, आपको Access-Control-Allow-Origin: * शीर्षलेख का उपयोग नहीं करना चाहिए। इसके बजाय, आपको उपयोगकर्ता के मूल मूल्य को प्रतिध्वनित करना चाहिए। उदाहरण के लिए:

Access-Control-Allow-Origin: http://www.example.com 

इस शीर्ष लेख प्रतिक्रिया डेटा का उपयोग करने केवल http://www.example.com की अनुमति देगा।

+2

क्या आप स्पष्ट कर सकते हैं कि 'मूल' शीर्षलेख को वापस प्रतिबिंबित करने से सुरक्षा में क्या जोड़ा जाता है? मुझे लगता है कि कोई भी दुर्भावनापूर्ण वेबसाइट/स्क्रिप्ट आसानी से इस हेडर को भी सेट कर सकती है? या क्या आप किसी प्रकार की श्वेतसूची बनाए रखने का मतलब रखते हैं? – Jeroen

+3

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

+0

मुझे लगता है कि आप कहने का मतलब है कि एक हमलावर प्रीफलाइट को रोक देगा, वास्तविक अनुरोध नहीं। यह भी ध्यान रखें कि जीईटी पहले से नहीं हैं। – csauve

15

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

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

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

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