कॉर्स - प्रीफ़लाइट अनुरोधों को पेश करने के पीछे प्रेरणा क्या है?


366

क्रॉस-ऑरिजनल रिसोर्स शेयरिंग एक ऐसा मैकेनिज्म है जो वेब पेज को XMLHttpRequests को दूसरे डोमेन ( विकिपीडिया से ) बनाने की अनुमति देता है ।

मैं पिछले कुछ दिनों से CORS के साथ काम कर रहा हूं और मुझे लगता है कि मुझे इस बात की बहुत अच्छी समझ है कि सब कुछ कैसे काम करता है।

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

काफी खोज करने के बाद मुझे यह जानकारी www.w3.org (7.1.5) पर मिली :

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

मुझे लगता है कि यह वाक्य को समझने के लिए सबसे कठिन है। मेरी व्याख्या (इसे बेहतर रूप से 'सर्वश्रेष्ठ अनुमान' कहा जाना चाहिए) यह है कि यह सर्वर सी के अनुरोधों के खिलाफ सर्वर बी की रक्षा करने के बारे में है जो कल्पना से अवगत नहीं है।

क्या कोई कृपया एक परिदृश्य की व्याख्या कर सकता है / एक समस्या दिखा सकता है कि पीआर + आरआर अकेले आरआर से बेहतर है?

जवाबों:


323

मैंने प्रीफ़लाइट अनुरोध के उद्देश्य के रूप में भ्रमित होने में कुछ समय बिताया लेकिन मुझे लगता है कि मुझे अब मिल गया है।

मुख्य अंतर्दृष्टि यह है कि प्रीफ़्लाइट अनुरोध कोई सुरक्षा चीज़ नहीं है। बल्कि, वे एक नियम बदलने वाली बात नहीं है।

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

यहाँ तीन परिदृश्य हैं:

  1. पुराने सर्वर, अब विकास के अधीन नहीं हैं, और कोर से पहले विकसित हुए हैं। ये सर्वर यह धारणा बना सकते हैं कि वे कभी भी क्रॉस-डोमेन DELETE अनुरोध जैसे उदाहरण प्राप्त नहीं करेंगे। यह परिदृश्य प्रीफ़लाइट तंत्र का प्राथमिक लाभार्थी है। हां, इन सेवाओं का दुर्भावनापूर्ण या गैर-अनुरूपण उपयोगकर्ता एजेंट द्वारा दुरुपयोग किया जा सकता है (और CORS इसे बदलने के लिए कुछ भी नहीं करता है), लेकिन CORS के साथ एक दुनिया में प्रीफ़्लाइट तंत्र एक अतिरिक्त 'पवित्रता जाँच' प्रदान करता है ताकि क्लाइंट और सर्वर न हों ब्रेक क्योंकि वेब के अंतर्निहित नियम बदल गए हैं।

  2. सर्वर जो अभी भी विकास के अधीन हैं, लेकिन जिनमें बहुत सारे पुराने कोड हैं और जिनके लिए क्रॉस-डोमेन की दुनिया में ठीक से काम करने के लिए सभी पुराने कोड का ऑडिट करना संभव नहीं है। यह परिदृश्य सर्वरों को उत्तरोत्तर कोर-इन करने के लिए अनुमति देता है, जैसे "अब मैं इस विशेष शीर्षक की अनुमति दूँगा", "अब मैं इस विशेष HTTP क्रिया की अनुमति दूंगा", "अब मैं कुकीज़ / सामान्य जानकारी होने दूंगा" भेजा गया ”, आदि इस परिदृश्य को प्रीफ़्लाइट तंत्र से लाभ मिलता है।

  3. नए सर्वर जिन्हें CORS की जागरूकता के साथ लिखा गया है। मानक सुरक्षा प्रथाओं के अनुसार, सर्वर को किसी भी आने वाले अनुरोध के सामने अपने संसाधनों की रक्षा करनी होती है - सर्वर ग्राहकों पर दुर्भावनापूर्ण काम नहीं करने के लिए भरोसा नहीं कर सकते। यह परिदृश्य प्रीफ़लाइट तंत्र से लाभ नहीं उठाता है : प्रीफ़्लाइट तंत्र किसी सर्वर पर अतिरिक्त सुरक्षा नहीं लाता है जिसने इसके संसाधनों को ठीक से संरक्षित किया हो।


12
अगर ऐसा है तो इसे हर अनुरोध पर क्यों भेजा जाता है? सर्वर के प्रति एक अनुरोध यह निर्धारित करने के लिए पर्याप्त होना चाहिए कि क्या सर्वर कोर से अवगत है।
डगलस फर्ग्यूसन

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

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

5
समस्या यह है कि, प्रीफ़्लाइट-परिणाम-कैश मूल रूप से बेकार है क्योंकि 1. यह केवल सटीक अनुरोध पर लागू होता है, संपूर्ण डोमेन पर नहीं, इसलिए सभी अनुरोध पहली बार वैसे भी पहले से लागू होने जा रहे हैं; और 2. जैसा कि लागू किया गया है, यह अधिकांश ब्राउज़रों में 10 मिनट तक सीमित है, इसलिए अनिश्चित काल के करीब भी नहीं है।
डैविडगोली

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

215

प्रीफ़लाइट अनुरोधों को पेश करने के पीछे प्रेरणा क्या थी?

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

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

क्या आप मुझे एक उदाहरण दे सकते हैं?

आइए कल्पना करें कि एक ब्राउज़र उपयोगकर्ता अपनी बैंकिंग साइट पर लॉग इन है A.com। जब वे दुर्भावनापूर्ण तरीके से नेविगेट करते हैं B.com, तो उस पृष्ठ में कुछ जावास्क्रिप्ट शामिल होते हैं जो DELETEअनुरोध भेजने की कोशिश करते हैं A.com/account। चूंकि उपयोगकर्ता लॉग इन है A.com, इसलिए उस अनुरोध को, यदि भेजा जाता है, तो उपयोगकर्ता को पहचानने वाले कुकीज़ शामिल होंगे।

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

ब्राउज़र बस भेज सकता है DELETEऔर सर्वर को यह तय करने की अनुमति देता है कि उसे कैसे संभालना है। लेकिन क्या होगा अगर A.comकॉर्स प्रोटोकॉल के बारे में पता नहीं है? यह आगे बढ़ सकता है और खतरनाक को अंजाम दे सकता है DELETE। यह माना जा सकता है कि - ब्राउज़र की समान उत्पत्ति नीति के कारण - इसे ऐसा अनुरोध कभी नहीं मिल सकता है, और इस तरह इस तरह के हमले के खिलाफ इसे कभी कठोर नहीं किया जा सकता है।

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

क्यों ब्राउज़र के बारे में यह सब उपद्रव, हमलावर सिर्फ DELETEअपने कंप्यूटर से एक अनुरोध नहीं भेज सकते हैं ?

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

यह क्रॉस-साइट रिक्वेस्ट फोर्जरी की तरह लगता है , जहां साइट पर एक फॉर्म उपयोगकर्ता की कुकीज़ के साथ B.comहो सकता POSTहै A.comऔर नुकसान कर सकता है।

ये सही है। इसे लगाने का एक और तरीका यह है कि गैर-कोर-जागरूक सर्वरों के लिए सीएसआरएफ हमले की सतह में वृद्धि नहीं करने के लिए प्रीफ़्लाइट अनुरोध बनाए गए थे।

लेकिन को देख आवश्यकताओं "सरल" अनुरोध करता है कि preflights की आवश्यकता नहीं है के लिए, मैं उस को देखने के POSTअभी भी अनुमति दी है। यह राज्य को बदल सकता है और डेटा को हटा सकता है जैसे DELETE!

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

आह। ठीक है, मैं आभारपूर्वक प्रीफ़लाइट अनुरोधों की आवश्यकता को स्वीकार करता हूं। लेकिन हमें सर्वर पर प्रत्येक संसाधन (URL) के लिए क्यों करना है? सर्वर या तो कोर को संभालता है या यह नहीं करता है।

क्या अापको उस बारे में पूर्ण विशवास है? किसी एकल डोमेन के अनुरोधों को संभालने के लिए कई सर्वरों के लिए यह असामान्य नहीं है। उदाहरण के लिए, यह ऐसा मामला हो सकता है जो अनुरोधों को A.com/url1एक प्रकार के सर्वर द्वारा नियंत्रित किया जाता है और अनुरोधों को A.com/url2एक अलग प्रकार के सर्वर द्वारा नियंत्रित किया जाता है। यह आम तौर पर ऐसा नहीं है कि किसी एकल संसाधन को संभालने वाला सर्वर उस डोमेन पर सभी संसाधनों के बारे में सुरक्षा गारंटी दे सकता है।

ठीक। समझौता करते हैं। आइए एक नया CORS हेडर बनाएं जो सर्वर को यह बताने की अनुमति देता है कि वह किन संसाधनों के लिए बोल सकता है, ताकि उन URL पर अतिरिक्त प्रीफ़्लाइट अनुरोधों से बचा जा सके।

अच्छा विचार! वास्तव में, हेडर Access-Control-Policy-Pathसिर्फ इस उद्देश्य के लिए प्रस्तावित किया गया था। अंततः, हालांकि, इसे विनिर्देश से बाहर रखा गया था, जाहिरा तौर पर क्योंकि कुछ सर्वरों ने यूआरआई विनिर्देश को इस तरह से गलत तरीके से लागू किया था कि ब्राउज़र को सुरक्षित लगने वाले रास्तों का अनुरोध वास्तव में टूटे सर्वर पर सुरक्षित नहीं होगा।

क्या यह एक विवेकपूर्ण निर्णय था कि प्रदर्शन पर सुरक्षा को प्राथमिकता दी गई थी, जिससे ब्राउज़रों को मौजूदा सर्वरों को जोखिम में डाले बिना तुरंत कॉर्स विनिर्देश को लागू करने की अनुमति मिली? या क्या यह बर्बाद करने के लिए इंटरनेट को बर्बाद करने के लिए शॉर्टसाइड किया गया था और एक विशेष समय में किसी विशेष सर्वर में बग को समायोजित करने के लिए केवल विलंबता को दोगुना करने के लिए?

राय अलग है।

खैर, बहुत कम से कम ब्राउज़रों को एक URL के लिए प्रीफ़्लाइट कैश करना होगा?

हाँ। हालांकि शायद बहुत लंबे समय के लिए नहीं। WebKit ब्राउज़रों में वर्तमान में कैफ़े का अधिकतम समय 10 मिनट है

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

आपका एकमात्र वास्तविक विकल्प यह सुनिश्चित करना है कि आप "सरल" अनुरोधों की आवश्यकताओं को पूरा करते हैं। इसका मतलब यह हो सकता है कि कस्टम हेडर छोड़ने से आप अन्यथा (जैसे X-Requested-With), के बारे में Content-Typeया अधिक झूठ बोलना शामिल करेंगे ।

जो कुछ भी आप करते हैं, आपको यह सुनिश्चित करना चाहिए कि आपके पास उचित सीएसआरएफ सुरक्षा मौजूद है क्योंकि कॉर्स विनिर्देश विनिर्देश असुरक्षित सहित "सरल" अनुरोधों को खारिज नहीं करता है POSTजैसा कि विनिर्देश इसे कहते हैं : "ऐसे संसाधन जिनके लिए सरल अनुरोधों का पुनः प्राप्ति से इतर महत्व है, उन्हें क्रॉस-साइट रिक्वेस्ट फॉरगिरी से अपनी सुरक्षा करनी चाहिए"।


20
यह सबसे अच्छा परिचयात्मक टुकड़ा है जिसे मैंने कोर पर पढ़ा है। धन्यवाद!
किव

4
अजब तरह से समझाया।
प्रेट्ज

4
यह सबसे अच्छा जवाब है जो मैंने इस विषय पर देखा है। बहुत अच्छी तरह से समझाया!
अलाबौडी

3
कोर एक मुश्किल सामग्री है, और यह पोस्ट कुछ छिपे हुए बिंदुओं पर प्रकाश
डालती है

1
@Yos: ब्राउज़र में उन कुकीज़ को शामिल किया जाएगा, क्योंकि ब्राउज़र से काम करने की अपेक्षा की जाती है (जैसा कि RFC 6265 जैसे मानकों में कोडित है )। कोई ब्राउज़र टैब के लिए अलग-अलग प्रक्रियाओं का उपयोग करता है या नहीं, यह एक कार्यान्वयन विवरण है, यह इसे कुकी भेजने से नहीं रखेगा।
केविन क्रिस्टोफर हेनरी

51

CORS से पहले क्रॉस-डोमेन अनुरोधों की दुनिया पर विचार करें। आप एक मानक फ़ॉर्म POST कर सकते हैं, या एक GET अनुरोध जारी करने के लिए scriptएक imageटैग का उपयोग कर सकते हैं। आप GET / POST के अलावा कोई अन्य अनुरोध नहीं कर सकते, और आप इन अनुरोधों पर कोई कस्टम हेडर जारी नहीं कर सकते।

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

इसलिए बिना किसी कस्टम हेडर के GET / POST अनुरोधों को प्रीफ़लाइट की आवश्यकता नहीं है, क्योंकि ये अनुरोध CORS से पहले ही संभव थे। लेकिन कस्टम हेडर, या PUT / हटाने अनुरोध के साथ किसी भी अनुरोध, है एक preflight की जरूरत है, के बाद से इन CORS कल्पना के लिए नए हैं। यदि सर्वर को कोर के बारे में कुछ भी नहीं पता है, तो वह बिना किसी कोर-विशिष्ट हेडर के उत्तर देगा, और वास्तविक अनुरोध नहीं किया जाएगा।

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


आप स्क्रिप्ट / img टैग के माध्यम से एक POST अनुरोध कैसे करते हैं?
अजीब

2
आप नहीं कर सकते। मेरा मतलब था कि आप या तो एक POST कर सकते हैं, या स्क्रिप्ट / img का उपयोग करके एक GET कर सकते हैं। मैंने इसको स्पष्ट करने के लिए पोस्ट को संपादित किया।
मोनसुर

समझा। यह समझ आता है।
मारक

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

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

37

कॉर्स आपको अधिक हेडर और विधि प्रकारों को निर्दिष्ट करने की अनुमति देता है जो पहले क्रॉस-ऑरिजनल <img src>या संभव था <form action>

कुछ सर्वर इस अनुमान के साथ सुरक्षित (खराब) हो सकते थे कि कोई ब्राउज़र नहीं बना सकता, जैसे हेडर के DELETEसाथ क्रॉस-ऑरिजिन रिक्वेस्ट या क्रॉस-ऑरिजिन रिक्वेस्ट X-Requested-With, इसलिए ऐसे रिक्वेस्ट "भरोसेमंद" होते हैं।

यह सुनिश्चित करने के लिए कि सर्वर वास्तव में वास्तव में कॉर्स का समर्थन करता है और न केवल यादृच्छिक अनुरोधों का जवाब देने के लिए होता है, प्रीफ्लाइट निष्पादित होता है।


12
यह स्वीकृत उत्तर होना चाहिए था। यह सबसे असंदिग्ध और महत्वपूर्ण है। संक्षेप में प्री-लाइट अनुरोधों का एकमात्र बिंदु प्री-कोर वेब मानकों को पोस्ट-कोर वेब मानकों के साथ एकीकृत करना है।
हेलिकॉप्टर ड्रा शेर सिंह 4

2
मुझे यह उत्तर पसंद है, लेकिन मुझे लगता है कि यह पूर्ण कारण नहीं हो सकता है ... "विश्वास की धारणा" ने केवल उन चीजों पर लागू किया होगा जो केवल ब्राउज़र ही कर सकता था (विशेष रूप से, ब्राउज़र की उपयोगकर्ता जानकारी को अपने डोमेन तक सीमित करके - वह है, कुकीज़)। यदि यह धारणा का हिस्सा नहीं था, तो कुछ भी एक क्रॉस-ऑरिजिनल ब्राउज़र अनुरोध जो पहले से ही एक 3-पार्टी, गैर-ब्राउज़र एजेंट द्वारा किया जा सकता है, है ना?
फैबियो बेल्ट्रामिनी

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

मुझे वास्तविक समस्या दिखाई देने लगती है। टिप्पणियों और उत्तर के लिए धन्यवाद @ FabioBeltramini और क्रोनल का उत्तर। यदि प्री-फ्लाइट चेक नहीं है, तो एक हमलावर अपनी साइट पर कुछ जावास्क्रिप्ट कोड डाल सकता है, लेकिन कई अन्य लोगों के कंप्यूटर से निष्पादित किया जाएगा। अन्य सभी क्लाइंट मोबाइल ऐप सहित ऐसा करने के लिए दूसरों को 'किराया' देना मुश्किल है।
जिओ पेंग - ZenUML.com

16

कोड का उपयोग करके इसे देखने का एक और तरीका यहां दिया गया है:

<!-- hypothetical exploit on evil.com -->
<!-- Targeting banking-website.example.com, which authenticates with a cookie -->
<script>
jQuery.ajax({
  method: "POST",
  url: "https://banking-website.example.com",
  data: JSON.stringify({
    sendMoneyTo: "Dr Evil",
    amount: 1000000
  }),
  contentType: "application/json",
  dataType: "json"
});
</script>

पूर्व-कोर, ऊपर का शोषण प्रयास विफल हो जाएगा क्योंकि यह समान-मूल नीति का उल्लंघन करता है। इस तरह से डिज़ाइन किए गए एक एपीआई को XSRF सुरक्षा की आवश्यकता नहीं थी, क्योंकि यह ब्राउज़र के मूल सुरक्षा मॉडल द्वारा संरक्षित था। पूर्व-कोर ब्राउज़र के लिए क्रॉस-उत्पत्ति JSON POST उत्पन्न करना असंभव था।

अब कोर्स सीन पर आता है - यदि पूर्व उड़ान के माध्यम से कॉर्स में ऑप्‍ट-इन की आवश्‍यकता नहीं थी, तो अचानक इस साइट पर उनकी कोई गलती नहीं होगी।

यह समझाने के लिए कि पूर्व उड़ान को छोड़ने के लिए कुछ अनुरोधों की अनुमति क्यों दी गई है , इसका उत्तर युक्ति द्वारा दिया गया है:

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

यह जानने के लिए कि, GET पूर्व-उड़ान नहीं है क्योंकि यह 7.1.5 द्वारा परिभाषित एक "सरल विधि" है। (पूर्व उड़ान से बचने के लिए हेडर को "सरल" भी होना चाहिए)। इसके लिए औचित्य यह है कि "सरल" क्रॉस-उत्पत्ति GET अनुरोध पहले से ही किया जा सकता है जैसे <script src="">(यह JSONP कैसे काम करता है)। चूंकि किसी srcविशेषता वाला कोई तत्व बिना पूर्व-उड़ान के साथ एक क्रॉस-मूल जीईटी को ट्रिगर कर सकता है, इसलिए "सरल" एक्सएचआर पर पूर्व-लड़ाई की आवश्यकता के लिए कोई सुरक्षा लाभ नहीं होगा।


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

हालांकि, एम्बियंट अथॉरिटी के साथ यही समस्या है कि आप इसका दुरुपयोग कर सकते हैं।
माइल्स रूट

13

मुझे लगता है कि अन्य उत्तर पूर्व-लड़ाई के कारण सुरक्षा पर ध्यान केंद्रित नहीं कर रहे हैं।

परिदृश्य:

1) पूर्व उड़ान के साथ । एक हमलावर साइट dummy-forums.com से एक अनुरोध करता है, जबकि उपयोगकर्ता को safe-bank.com प्रमाणित किया जाता है।
यदि सर्वर मूल के लिए जाँच नहीं करता है, और किसी तरह एक दोष है, तो ब्राउज़र एक पूर्व-उड़ान अनुरोध जारी करेगा, विकल्प। तरीका। सर्वर उस कॉर्स में से कोई भी नहीं जानता है कि ब्राउज़र एक प्रतिक्रिया के रूप में उम्मीद कर रहा है इसलिए ब्राउज़र आगे नहीं बढ़ेगा (कोई नुकसान नहीं)

2) पूर्व-उड़ान के बिना । एक हमलावर ऊपर के समान परिदृश्य के तहत अनुरोध का अनुरोध करता है, ब्राउज़र तुरंत POST या PUT अनुरोध जारी करेगा, सर्वर इसे स्वीकार करता है और इसे संसाधित कर सकता है, इससे संभवतः कुछ नुकसान होगा।

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

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


CSRF हमले के मुद्दे पर सहमत हैं, जो @ michael-iles के उत्तर में वर्णित "नए सर्वर" के खिलाफ अभी भी संभव है।
eel ghEEz

यह एक उपयोगी वर्णन है कि यह संभवतः कहीं और रिकॉर्ड करने के लिए सार्थक होगा। शायद एमडीएन पृष्ठों में से एक में इसे जोड़ने पर विचार करें?
साइडशोबर्कर

लेकिन सामग्री-प्रकार के पाठ / सादे के साथ POST जैसे कुछ अनुरोध पूर्व-उड़ान अनुरोध क्यों नहीं करते हैं? मेरे सिर में, हर 'राइट' रिक्वेस्ट (POST, PUT, DELETE) के पास यह प्री-फ़्लाइट रिक्वेस्ट होनी चाहिए अगर सुरक्षा कोई समस्या है।
इज़राइल फोंसेका

टेक्स्ट / प्लेन के साथ POST को एक साधारण अनुरोध माना जाता है - ध्यान दें कि यदि ब्राउज़र मैच नहीं करता है तो ब्राउज़र प्रतिक्रिया को प्रदर्शित नहीं करेगा (जो सर्वर कोर के लिए कॉन्फ़िगर नहीं किया गया है तो मामला होगा)।
हिराको

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

3

इसके अतिरिक्त, HTTP अनुरोध विधियों के लिए जो उपयोगकर्ता डेटा पर दुष्प्रभाव (विशेष रूप से, GET के अलावा HTTP विधियों के लिए, या कुछ MIME प्रकारों के साथ POST उपयोग के लिए) पैदा कर सकता है, विनिर्देश उन ब्राउज़र को "प्रीफ़लाइट" अनुरोध के लिए अनिवार्य करता है

स्रोत


2

पूर्व-उड़ान अनुरोध उन अनुरोधों के लिए आवश्यक हैं जो सर्वर पर स्थिति बदल सकते हैं। अनुरोध के 2 प्रकार हैं -

1) सर्वर पर स्थिति नहीं बदल सकते हैं (जैसे GET) - उपयोगकर्ता को अनुरोध के लिए प्रतिक्रिया मिल सकती है (यदि सर्वर मूल के लिए जांच नहीं करता है), लेकिन यदि अनुरोध डोमेन को प्रतिक्रिया शीर्ष लेख में नहीं जोड़ा गया है तो एक्सेस-कंट्रोल- अनुमति-उत्पत्ति, ब्राउज़र उपयोगकर्ता को डेटा नहीं दिखाता है, अर्थात, अनुरोध ब्राउज़र से भेजा जाता है, लेकिन उपयोगकर्ता प्रतिक्रिया का उपयोग देखने / बनाने में सक्षम नहीं है।

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


1

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

कस्टम हेडर के अलावा PUT, DELETE और अन्य तरीकों के तथ्य को डिफ़ॉल्ट रूप से अनुमति नहीं है (उन्हें "एक्सेस-कंट्रोल-रिक्वेस्ट-मेथड्स" और "एक्सेस-कंट्रोल-रिक्वेस्ट-हेडर्स") के साथ स्पष्ट अनुमति की आवश्यकता है, जो लगता है डबल-चेक की तरह, क्योंकि ये ऑपरेशन GET अनुरोधों के बजाय उपयोगकर्ता डेटा के लिए अधिक प्रभाव डाल सकते हैं। तो, ऐसा लगता है:

"मैंने देखा कि आप http: //foo.example से क्रॉस-साइट अनुरोधों की अनुमति देते हैं, लेकिन क्या आप सुनिश्चित हैं कि आप DELETE अनुरोधों की अनुमति देंगे? क्या आपने उन प्रभावों पर विचार किया है जो उपयोगकर्ता डेटा में इन अनुरोधों का कारण हो सकते हैं?"

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


4
आप पहुंच-नियंत्रण-अनुमति-उत्पत्ति को गलत समझ रहे हैं। उस शीर्ष लेख की अनुपस्थिति ब्राउज़र को अनुरोध भेजने से नहीं रोकती है, यह जेएस को प्रतिक्रिया में डेटा पढ़ने में सक्षम होने से रोकती है।
डायलन टैक

क्या आप इसे समझा सकते हैं 'उस हेडर की अनुपस्थिति ब्राउज़र को अनुरोध भेजने से रोकती नहीं है, यह केवल जेएस को प्रतिक्रिया में डेटा पढ़ने में सक्षम होने से रोकता है', मुझे यह पूरी तरह से नहीं मिलेगा।
सिद्धार्थभवन

@DylanTack अच्छी बात है। इससे मुझे आश्चर्य होता है कि, GET xhr प्रीफ्लाइट क्यों नहीं हो रहा है? हालांकि संभावना नहीं है, GET अनुरोध हानिकारक / डेटा-उत्परिवर्तन भी हो सकता है। इसके अलावा, चूंकि यह सब CSRF के साथ हल किया जा सकता है, यह मुझे ऐसा लगता है जैसे ब्राउज़र उन सर्वरों से अधिक सुरक्षात्मक हो रहा है जो सामान्य सुरक्षा प्रथाओं को लागू करने के लिए बहुत लापरवाही कर रहे हैं।
पेलेग

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

1

CORS का समर्थन करने वाले ब्राउज़र में, रीडिंग अनुरोध (जैसे GET) पहले से ही मूल नीति द्वारा सुरक्षित हैं: एक दुर्भावनापूर्ण वेबसाइट जो एक प्रमाणित क्रॉस-डोमेन अनुरोध बनाने की कोशिश कर रही है (उदाहरण के लिए पीड़ित की इंटरनेट बैंकिंग वेबसाइट या राउटर के कॉन्फ़िगरेशन इंटरफ़ेस के लिए) नहीं होगी लौटा डेटा पढ़ने में सक्षम हो क्योंकि बैंक या राउटर Access-Control-Allow-Originहेडर सेट नहीं करता है ।

हालाँकि, अनुरोध लिखने (POST की तरह) से नुकसान तब होता है जब अनुरोध वेबसर्वर पर आता है। * एक वेबसर्वर यह Originनिर्धारित करने के लिए हेडर की जांच कर सकता है कि क्या अनुरोध वैध है, लेकिन यह चेक अक्सर लागू नहीं किया जाता है क्योंकि या तो वेबसर्वर की कोई आवश्यकता नहीं है। CORS या वेबसर्वर के लिए CORS से पुराना है और इसलिए यह माना जाता है कि क्रॉस-डोमेन POST को समान-मूल नीति द्वारा पूरी तरह से मना किया गया है।

यही कारण है कि वेबसर्वरों को क्रॉस-डोमेन लिखने के अनुरोधों को चुनने का मौका दिया जाता है ।

* अनिवार्य रूप से CSRF का AJAX संस्करण।

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