2014-12-08 6 views
14

मैं CORS पर पढ़ रहा हूं और यह कैसे काम करता है, लेकिन मुझे बहुत सारी चीजें उलझन में मिल रही हैं। उदाहरण के लिए, वहाँ की तरहसीओआरएस हल करने के लिए क्या समस्या आ रही है?

उपयोगकर्ता Joe ब्राउज़र BrowserX उपयोग कर रहा है site.com से डेटा प्राप्त करने, जो बारी में spot.com के लिए अनुरोध भेजता चीजों के बारे में विवरण के बहुत सारे हैं। इस अनुमति के लिए, spot विशेष हेडर है ... पर होने वाली बात बेकार

ज्यादा पृष्ठभूमि के बिना, मुझे समझ नहीं आता क्यों वेबसाइटों कुछ स्थानों से अनुरोध नहीं जाने देंगे। मेरा मतलब है, वे अनुरोधों के जवाब देने के लिए मौजूद हैं, है ना? कुछ लोगों के अनुरोधों की अनुमति क्यों नहीं दी जाएगी?

यह वास्तव में समस्या का एक अच्छा स्पष्टीकरण (या एक लिंक) की सराहना करेगा CORS हल करने के लिए बनाया गया है।

तो सवाल यह है,

क्या है समस्या CORS सुलझाने रहा है?

उत्तर

14

जावास्क्रिप्ट (AKA AJAX) के माध्यम से किसी पृष्ठ से अनुरोध शुरू करने वाले वेब ब्राउज़र का डिफ़ॉल्ट व्यवहार यह है कि वे same-origin policy का पालन करते हैं। इसका अर्थ है कि अनुरोध केवल AJAX के माध्यम से उसी डोमेन (या उप डोमेन) में किए जा सकते हैं। एक पूरी तरह से अलग डोमेन के लिए अनुरोध विफल हो जाएगा।

यह प्रतिबंध मौजूद है क्योंकि आपके ब्राउज़र द्वारा अन्य डोमेन पर किए गए अनुरोध आपके कुकीज़ के साथ ले जाएंगे, जिसका अर्थ है कि आप दूसरी साइट पर लॉग इन होंगे। तो, बिना मूल के, किसी भी साइट उदाहरण के लिए stackoverflow.com पर लॉगआउट नामक जावास्क्रिप्ट होस्ट कर सकता है, और यह आपको लॉग आउट करेगा। अब जब हम सोशल नेटवर्क्स, बैंकिंग साइट्स इत्यादि के बारे में बात करते हैं तो जटिलताओं की कल्पना करें।

तो, सभी ब्राउज़र बस स्क्रिप्ट-आधारित नेटवर्क कॉल को अपने डोमेन पर सरल और सुरक्षित बनाने के लिए प्रतिबंधित करते हैं। www.x.com पर

साइट एक्स केवल करने के लिए www.y.com पर साइट वाई के AJAX अनुरोध नहीं कर सकते, * .x.com

वहाँ जगह में कुछ ज्ञात काम arounds हैं (जैसे जेएसओएनपी जिसमें अनुरोध में कुकीज़ शामिल नहीं है), लेकिन ये स्थायी समाधान नहीं हैं।

CORS इन क्रॉस-डोमेन अनुरोधों को होने की अनुमति देता है, लेकिन केवल तभी जब प्रत्येक पक्ष CORS समर्थन में जाता है।

+0

आह ठीक है, तो यह ब्राउज़र है जो इन नियमों को सेट करता है। यदि ऐसा है, तो सर्वर अंत में 'एक्सेस-कंट्रोल-ऑब्जेक्ट-ओरिजिन' के साथ क्या है? क्रॉस मूल अनुरोध कैसे प्राप्त करेंगे यदि ब्राउजर इसे अनुमति नहीं देगा? – CodyBugstein

+0

@Imray - मेरे उत्तर में कॉर्स लिंक देखें। नए ब्राउज़र * समर्थन * सीओआरएस अगर साइट * * का उपयोग करने के लिए ऑप्ट इन करें (हेडर के माध्यम से)। – Haney

+0

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

1

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

9

सबसे पहले, आइए उसी मूल नीति के बारे में बात करते हैं।मैं a previous answer of mine से बोली होगी:

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

उदाहरण के लिए, मान लीजिए कि मैं गलती से http://evil.com/ लोड करता हूं, जो http://mail.google.com/ के लिए अनुरोध भेजता है। अगर एसओपी जगह पर नहीं था, और मुझे जीमेल में साइन इन किया गया था, तो evil.com पर लिपि मेरे इनबॉक्स को देख सकती थी। यदि evil.com पर साइट मेरी कुकीज़ के बिना mail.google.com लोड करना चाहता है, तो यह केवल प्रॉक्सी सर्वर का उपयोग कर सकती है; mail.google.com की सार्वजनिक सामग्री एक रहस्य नहीं है (लेकिन mail.google.com की सामग्री जब मेरी कुकीज़ के साथ उपयोग की जाती है तो एक रहस्य है)।

(ध्यान दें कि मैंने कहा है कि "क्रेडेंशियल-प्रतिबंधित सामग्री", लेकिन यह भी topology-restricted content हो सकता है जब एक वेबसाइट केवल विशेष IP पतों पर दिख रहा है।)

कभी कभी, तथापि, यह evil.com कोशिश नहीं कर रहा है अपने इनबॉक्स में देखने के लिए। कभी-कभी, यह एक सहायक वेबसाइट है (कहें, http://goodsite.foo) किसी अन्य मूल से सार्वजनिक एपीआई का उपयोग करने का प्रयास करें (कहें, http://api.example.com)। api.example.comपर कड़ी मेहनत करने वाले प्रोग्रामर सभी मूल अपनी साइट की सामग्री को स्वतंत्र रूप से एक्सेस करने के लिए चाहते हैं। उस स्थिति में, api.example.com पर एपीआई सर्वर अपने एपीआई प्रतिक्रियाओं तक पहुंचने के लिए goodsite.foo (या कोई अन्य अनुरोध मूल) को अनुमति देने के लिए सीओआरएस हेडर का उपयोग कर सकता है।

तो, राशि में, हम डिफ़ॉल्ट कि पार मूल पहुँच एक बुरी बात (किसी को अपने इनबॉक्स को पढ़ने का प्रयास के बारे में सोच) है द्वारा मान, लेकिन ऐसे मामले हैं जहां यह एक अच्छा बात है (की कोशिश कर रहा एक वेबसाइट के बारे में सोच एक सार्वजनिक एपीआई तक पहुंचने के लिए)। सीओआरएस अच्छा मामला तब होने की इजाजत देता है जब अनुरोधित साइट यह घटित हो।

+0

तो ब्राउज़र को अभी भी सभी साइटों को यह देखने के लिए कुछ प्रकार का अनुरोध भेजना है कि उनके पास है या नहीं 'कोर' हेडर, है ना? यदि 'bad.com' में मेरी बैंक साइट तक पहुंचने के लिए एक स्क्रिप्ट है, तो क्या मेरा ब्राउज़र एक परीक्षण अनुरोध या उन शीर्षकों की जांच करने के लिए कुछ भेज देगा, जबकि मेरी कुकीज़ को संलग्न नहीं किया जा रहा है? – CodyBugstein

+0

@Imray हां, नेटवर्क स्तर पर अनुरोध किए जाते हैं; सीओआरएस चेक विफल होने पर परिणाम केवल जावास्क्रिप्ट को नहीं दिखाए जाते हैं। मेरा जवाब देखें [एक्सेस-कंट्रोल-अनुमति-उत्पत्ति हेडर कैसे काम करता है?] (Http://stackoverflow.com/questions/10636611/how-does-access-control-allow-origin-header-work/10636765#10636765) (मेरी अपनी सामग्री से जुड़ने के लिए खेद है, लेकिन यह एक प्रश्न है जिसे मैंने कुछ बार पहले उत्तर दिया है और आपके प्रश्नों के लिए जुड़े उत्तरों (मुझे उम्मीद है) – apsillers

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