मैं सीएसआरएफ के साथ पूरे मामले को समझने की कोशिश कर रहा हूं और इसे रोकने के उचित तरीके। (संसाधन मैंने पढ़े हैं, समझे हैं, और इससे सहमत हैं: OWASP CSRF निरोध चेट शीट , CSRF के बारे में प्रश्न ।)
जैसा कि मैं इसे समझता हूं, CSRF के आसपास भेद्यता को इस धारणा से पेश किया जाता है कि (वेबसर्वर के दृष्टिकोण से) आने वाले HTTP अनुरोध में एक वैध सत्र कुकी एक प्रामाणिक उपयोगकर्ता की इच्छाओं को दर्शाता है। लेकिन मूल डोमेन के लिए सभी कुकीज़ ब्राउज़र द्वारा अनुरोध के साथ जादुई रूप से जुड़ी हुई हैं, इसलिए वास्तव में सभी सर्वर एक अनुरोध में मान्य सत्र कुकी की उपस्थिति से अनुमान लगा सकते हैं कि अनुरोध एक ब्राउज़र से आता है जिसमें एक प्रमाणित सत्र है; यह आगे कोड के बारे में कुछ भी नहीं मान सकता हैउस ब्राउज़र में चल रहा है, या क्या यह वास्तव में उपयोगकर्ता की इच्छाओं को दर्शाता है। इसे रोकने का तरीका अतिरिक्त प्रमाणीकरण जानकारी ("CSRF टोकन") को शामिल करना है, जो ब्राउज़र के स्वचालित कुकी हैंडलिंग के अलावा कुछ माध्यमों द्वारा किया जाता है। धीरे-धीरे बोलना, फिर, सत्र कुकी उपयोगकर्ता / ब्राउज़र को प्रमाणित करता है और CSRF टोकन ब्राउज़र में चल रहे कोड को प्रमाणित करता है।
इसलिए संक्षेप में, यदि आप अपने वेब एप्लिकेशन के उपयोगकर्ताओं को प्रमाणित करने के लिए एक सत्र कुकी का उपयोग कर रहे हैं, तो आपको प्रत्येक प्रतिक्रिया में एक CSRF टोकन भी जोड़ना चाहिए, और प्रत्येक (उत्परिवर्तन) अनुरोध में एक मिलान CSRF टोकन की आवश्यकता होनी चाहिए। CSRF टोकन तब सर्वर से ब्राउज़र पर वापस सर्वर पर एक राउंडट्रिप बनाता है, सर्वर को यह साबित करता है कि अनुरोध करने वाला पृष्ठ उस सर्वर द्वारा (द्वारा उत्पन्न, यहां तक कि) द्वारा अनुमोदित है।
मेरे सवाल पर, जो उस राउंडट्रिप पर उस सीएसआरएफ टोकन के लिए इस्तेमाल की जाने वाली विशिष्ट परिवहन पद्धति के बारे में है।
यह आम लगता है (जैसे कि AngularJS , Django , रेल्स ) में CSRF टोकन को सर्वर से क्लाइंट के रूप में कुकी (यानी सेट-कुकी हेडर में) भेजने के लिए, और फिर क्लाइंट में जावास्क्रिप्ट को कुकी से बाहर खुरच कर संलग्न करें। सर्वर पर वापस भेजने के लिए एक अलग XSRF-TOKEN हेडर के रूप में।
(एक वैकल्पिक विधि उदाहरण एक्सप्रेस द्वारा अनुशंसित एक है , जहां सर्वर द्वारा उत्पन्न सीएसआरएफ टोकन को सर्वर-साइड टेम्पलेट विस्तार के माध्यम से प्रतिक्रिया निकाय में शामिल किया गया है, कोड / मार्कअप से सीधे जुड़ा हुआ है जो इसे सर्वर को वापस आपूर्ति करेगा, जैसे। एक छिपे हुए रूप में इनपुट के रूप में। यह उदाहरण चीजों को करने का एक अधिक वेब 1.0-ईश तरीका है, लेकिन अधिक जेएस-भारी क्लाइंट के लिए ठीक होगा।)
CSRF टोकन के लिए डाउनस्ट्रीम परिवहन के रूप में सेट-कुकी का उपयोग करना इतना आम क्यों है / यह एक अच्छा विचार क्यों है? मुझे लगता है कि इन सभी रूपरेखाओं के लेखकों ने अपने विकल्पों पर ध्यान से विचार किया और यह गलत नहीं हुआ। लेकिन पहली नज़र में, कुकीज़ का उपयोग करने के लिए चारों ओर काम करने के लिए जो आवश्यक रूप से कुकीज़ पर एक डिज़ाइन सीमा है, बेतरतीब लगता है। वास्तव में, यदि आपने राउंडट्रिप ट्रांसपोर्ट (सेट-कुकी: सर्वर के लिए हेडर डाउनस्ट्रीम) का उपयोग किया है तो ब्राउज़र को CSRF टोकन बताने के लिए, और कुकी: ब्राउजर के लिए हेडर अपस्ट्रीम को सर्वर में वापस करने के लिए) आप अपनी भेद्यता का संकेत देंगे। ठीक करने की कोशिश कर रहे हैं।
मुझे लगता है कि CSRF टोकन के लिए पूरे चौखट के लिए कुकीज़ का उपयोग न करें। वे सेट-कुकी डाउनस्ट्रीम का उपयोग करते हैं, फिर कुछ और (जैसे एक एक्स-सीएसआरएफ-टोकन हेडर) अपस्ट्रीम, और यह भेद्यता को बंद कर देता है। लेकिन बहाव-परिवहन के रूप में सेट-कुकी का उपयोग करना भी संभावित भ्रामक और खतरनाक है; ब्राउज़र अब CSRF टोकन को हर अनुरोध पर संलग्न करेगा जिसमें वास्तविक दुर्भावनापूर्ण XSRF अनुरोध शामिल हैं; सबसे अच्छा है कि अनुरोध को बड़ा करने की जरूरत है और कम से कम कुछ अच्छी तरह से मतलब है, लेकिन सर्वर कोड का गुमराह टुकड़ा वास्तव में इसका इस्तेमाल करने की कोशिश कर सकता है, जो वास्तव में बुरा होगा। और आगे, चूंकि CSRF टोकन का वास्तविक इच्छित प्राप्तकर्ता क्लाइंट-साइड जावास्क्रिप्ट है, इसका मतलब है कि इस कुकी को केवल http के साथ संरक्षित नहीं किया जा सकता है।