प्रीफ़लाइट अनुरोधों को पेश करने के पीछे प्रेरणा क्या थी?
प्रीफ़्लाइट अनुरोध पेश किए गए थे ताकि एक ब्राउज़र यह सुनिश्चित कर सके कि यह कुछ अनुरोध भेजने से पहले एक कॉर्स-जागरूक सर्वर के साथ काम कर रहा था। उन अनुरोधों को उन लोगों के रूप में परिभाषित किया गया था जो संभावित रूप से खतरनाक (राज्य-परिवर्तनशील) और नए ( समान उत्पत्ति नीति के कारण कॉर्स से पहले संभव नहीं थे )। प्रीफ़लाइट अनुरोधों का उपयोग करने का अर्थ है कि सर्वर को नए, संभावित खतरनाक प्रकारों के अनुरोध को ऑप्ट-इन (प्रीफ़्लाइट को ठीक से जवाब देकर) करना चाहिए, जो कि कोरस संभव बनाता है।
विनिर्देश के इस भाग का अर्थ है : "इस विनिर्देश के अस्तित्व में होने से पहले कुछ उपयोगकर्ता एजेंटों से उत्पन्न होने वाले क्रॉस-ऑरिजनल अनुरोधों के विरुद्ध संसाधनों की सुरक्षा के लिए यह सुनिश्चित करने के लिए प्रीफ़्लाइट अनुरोध किया जाता है कि संसाधन इस विनिर्देश के बारे में जानते हैं।"
क्या आप मुझे एक उदाहरण दे सकते हैं?
आइए कल्पना करें कि एक ब्राउज़र उपयोगकर्ता अपनी बैंकिंग साइट पर लॉग इन है 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
। जैसा कि विनिर्देश इसे कहते हैं : "ऐसे संसाधन जिनके लिए सरल अनुरोधों का पुनः प्राप्ति से इतर महत्व है, उन्हें क्रॉस-साइट रिक्वेस्ट फॉरगिरी से अपनी सुरक्षा करनी चाहिए"।