एक्सेस-कंट्रोल-अनुमति-क्रेडेंशियल्स हेडर वास्तव में क्या करता है?


167

मैं यह समझने की कोशिश कर रहा हूं कि कॉर्स का उपयोग कैसे किया जाए और इस बारे में उलझन में हूं कि Access-Control-Allow-Credentialsहेडर क्या करता है।

दस्तावेज कहता है

यह दर्शाता है कि क्रेडेंशियल ध्वज के सत्य होने पर अनुरोध की प्रतिक्रिया उजागर हो सकती है या नहीं।

लेकिन मुझे समझ नहीं आ रहा है कि इस प्रतिक्रिया का "उजागर" क्या मतलब है।

क्या कोई बता सकता है कि यह हेडर सही पर सेट किया जा रहा है (वास्तव में सेट किए जा रहे क्रेडेंशियल फ्लैग के साथ) वास्तव में करता है?


xhr.withCredential डॉक ऑन क्लाइंट साइड डेवलपर.
Weishi Zeng

जवाबों:


264

डिफ़ॉल्ट रूप से, CORS में क्रॉस-ऑरिजिनल अनुरोधों पर कुकीज़ शामिल नहीं हैं। यह अन्य क्रॉस-ऑरिजिन तकनीकों से अलग है जैसे कि JSON-P। JSON-P में हमेशा अनुरोध के साथ कुकीज़ शामिल होती हैं, और इस व्यवहार के कारण क्रॉस-साइट अनुरोध जालसाजी या CSRF नामक कमजोरियों का एक वर्ग हो सकता है ।

कोर में CSRF कमजोरियों की संभावना को कम करने के लिए, CORS को सर्वर और क्लाइंट दोनों को यह स्वीकार करने की आवश्यकता होती है कि अनुरोधों पर कुकीज़ को शामिल करना ठीक है। ऐसा करने से कुकीज़ बिना किसी नियंत्रण के निष्क्रिय हो जाने की बजाय एक सक्रिय निर्णय बन जाती है।

ग्राहक कोड चाहिए सेट withCredentialsपर संपत्ति XMLHttpRequestके लिए trueआदेश की अनुमति देने के लिए।

हालाँकि, यह शीर्ष लेख अकेले पर्याप्त नहीं है। हेडर के साथ सर्वर को जवाब देना होगाAccess-Control-Allow-Credentials । इस हेडर के साथ प्रतिक्रिया करने का trueअर्थ है कि सर्वर क्रॉस-ऑरिजिनल अनुरोधों पर कुकीज़ (या अन्य उपयोगकर्ता क्रेडेंशियल्स) को शामिल करने की अनुमति देता है।

यदि आप क्रॉस-ऑरिजनल क्रेडेंशियल अनुरोधों को काम करना चाहते हैं तो आपको यह सुनिश्चित करने की भी ज़रूरत है कि आपका ब्राउज़र तृतीय-पक्ष कुकीज़ को ब्लॉक नहीं कर रहा है।

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


1
मैंने आपके प्रश्न का उत्तर देने के लिए स्पष्टीकरण दिया। मूल रूप से JSON-P इसे गलत करता है, और कम सुरक्षित है।
महाशय ११'१४

28
बस "उजागर" के अर्थ पर टिप्पणी करने के लिए इसे थोड़ा जोड़ना चाहते हैं। जीईटी अनुरोधों के लिए युक्ति को पूर्व उड़ान (अतिरिक्त राउंडट्रिप की जांच करने की आवश्यकता नहीं है कि सर्वर क्रेडेंशियल की अनुमति देगा)। प्रीफ़्लाइ करने के बजाय, ब्राउज़र हमेशा केवल अनुरोध करेगा, अगर withCredentialsसेट किया गया है तो कुकीज़ भेज रहा है, लेकिन तब जब वह प्रतिक्रिया प्राप्त करता है, अगर withCredentials सेट किया गया था, तो यह कॉलिंग जावास्क्रिप्ट को केवल परिणाम देगा / उजागर करेगा यदि प्रतिक्रिया के पास पहुंच है -Control- अनुमति-क्रेडेंशियल्स हेडर सेट। यदि कोई हेडर नहीं है, तो वह प्रतिक्रिया को उजागर नहीं करता है, इसे प्रभावी ढंग से ब्लैक-होलिंग करता है।
१५'१५

4
@ heavi5ide, Yea, भले ही ब्राउज़र क्लाइंट कोड की प्रतिक्रिया को उजागर नहीं करता है, फिर भी अनुरोध-के साथ कुकी अभी भी (गैर-पूर्व-अनुरोधित अनुरोधों के लिए) भेजी गई थी। तो CSRF अभी भी किया जाएगा।
पचेरियर

7
चूंकि यह इतना लोकप्रिय उत्तर है, मैं एक और महत्वपूर्ण जानकारी जोड़ने जा रहा हूं: आपके अनुरोध और प्रतिक्रिया हेडर को सही ढंग से कॉन्फ़िगर करने के अलावा, आपको यह भी सुनिश्चित करने की आवश्यकता है कि यदि आपका ब्राउज़र तृतीय-पक्ष कुकीज़ को अवरुद्ध नहीं कर रहा है, तो आप काम के लिए क्रॉस-ऑरिजनल क्रेडेंशियल अनुरोध चाहते हैं। देखें stackoverflow.com/a/16634887/2970321
एलेक्सव

5
यह ऐसा स्पष्ट उत्तर है कि इसे पढ़ने वाला कोई भी व्यक्ति पहली बार अपने कोड को समझ सकता है और ठीक कर सकता है जो कुकीज़ के साथ अच्छी तरह से काम नहीं करता है। धन्यवाद!
asgs
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.