ruby on rails रेल प्रामाणिकता टोकन को समझना




ruby-on-rails authenticity-token (7)

मैं रेल में प्रामाणिकता टोकन के संबंध में कुछ मुद्दों पर चल रहा हूं, क्योंकि अब मेरे पास कई बार है।

लेकिन मैं वास्तव में इस समस्या को हल नहीं करना चाहता हूं और आगे बढ़ना चाहता हूं। मैं वास्तव में प्रामाणिकता टोकन को समझना चाहूंगा। खैर, मेरा सवाल यह है कि, क्या आपके पास इस विषय पर जानकारी का पूरा स्रोत है या आप यहां विवरणों में व्याख्या करने के लिए अपना समय व्यतीत करेंगे?

https://code.i-harness.com


सीएसआरएफ क्या है?

प्रामाणिकता टोकन क्रॉस-साइट अनुरोध फोर्जरी (सीएसआरएफ) का प्रतिद्वंद्विता है। सीएसआरएफ क्या है, आप पूछते हैं?

यह एक तरीका है कि एक हमलावर सत्र टोकन को जानने के बिना संभावित रूप से सत्र को हाइजैक कर सकता है।

परिदृश्य :

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

सीएसआरएफ समाधान :

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

क्या होता है

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

ऐसा क्यों होता है

चूंकि प्रामाणिकता टोकन सत्र में संग्रहीत है, इसलिए ग्राहक इसका मूल्य नहीं जान सकता है। यह लोगों को उस ऐप के भीतर फ़ॉर्म को देखे बिना एक रेल ऐप में फ़ॉर्म सबमिट करने से रोकता है। कल्पना करें कि आप सेवा ए का उपयोग कर रहे हैं, आपने सेवा में लॉग इन किया है और सबकुछ ठीक है। अब कल्पना करें कि आप सेवा बी का उपयोग करने के लिए गए थे, और आपने अपनी पसंद की एक तस्वीर देखी, और इसके बड़े आकार को देखने के लिए चित्र पर दबाया। अब, यदि सर्विस बी पर कुछ बुरा कोड था, तो यह सेवा ए (जिसे आप लॉग इन हैं) के लिए एक अनुरोध भेज सकते हैं, और http://serviceA.com/close_account अनुरोध भेजकर, अपना खाता हटाने के लिए कह सकते हैं। यह सीएसआरएफ (क्रॉस साइट अनुरोध फोर्जरी) के रूप में जाना जाता है।

यदि सेवा ए प्रामाणिकता टोकन का उपयोग कर रहा है, तो यह हमला वेक्टर अब लागू नहीं है, क्योंकि सेवा बी के अनुरोध में सही प्रामाणिकता टोकन नहीं होगा, और जारी रखने की अनुमति नहीं दी जाएगी।

एपीआई दस्तावेज़ मेटा टैग के बारे में विवरण का वर्णन करता है:

protect_from_forgery सुरक्षा protect_from_forgery विधि के साथ चालू है, जो टोकन की जांच करता है और सत्र को रीसेट करता है यदि यह अपेक्षित मिलान से मेल नहीं खाता है। डिफ़ॉल्ट रूप से नए रेल अनुप्रयोगों के लिए इस विधि को कॉल किया गया है। टोकन पैरामीटर को डिफ़ॉल्ट रूप से authenticity_token नाम दिया गया है। इस टोकन का नाम और मान HTML लेआउट में csrf_meta_tags सहित फ़ॉर्म को प्रस्तुत करने वाले प्रत्येक लेआउट में जोड़ा जाना चाहिए।

टिप्पणियाँ

ध्यान रखें, रेल केवल बेवकूफ तरीकों की पुष्टि नहीं करते हैं (पोस्ट, पुट / पैच और हटाएं)। प्रामाणिकता टोकन के लिए अनुरोध प्राप्त नहीं किया गया है। क्यूं कर? क्योंकि HTTP विनिर्देश बताता है कि अनुरोध प्राप्त करना बेवकूफ है और सर्वर पर संसाधनों को बनाना, परिवर्तित करना या नष्ट नहीं करना चाहिए, और अनुरोध बेवकूफ होना चाहिए (यदि आप एक ही कमांड को कई बार चलाते हैं, तो आपको हर बार एक ही परिणाम मिलना चाहिए)।

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

पाठ

अपने idempotent विधियों (पोस्ट, पुट / पैच, और हटाएं) की रक्षा के लिए authenticity_token का उपयोग करें। यह भी सुनिश्चित करें कि किसी भी जीईटी अनुरोधों को अनुमति न दें जो सर्वर पर संसाधनों को संभावित रूप से संशोधित कर सके।

संपादित करें: Gert अनुरोधों के बारे में @erturne द्वारा टिप्पणी की जांच करें । उन्होंने इसे यहां से बेहतर तरीके से समझाया है।


चूंकि Authenticity Token इतना महत्वपूर्ण है, और रेल 3.0+ में आप इसका उपयोग कर सकते हैं

 <%= token_tag nil %>

बनाना

<input name="authenticity_token" type="hidden" value="token_value">

कहीं भी


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

यदि आपको अपने AJAX स्क्रिप्ट एक्सेस को अस्वीकार करने वाली रेलों में कठिनाई हो रही है, तो आप इसका उपयोग कर सकते हैं

<%= form_authenticity_token %>

जब आप अपना फॉर्म बना रहे हों तो सही टोकन उत्पन्न करें।

आप documentation में इसके बारे में अधिक पढ़ सकते हैं।


क्रॉस-साइट अनुरोध जालसाजी (सीएसआरएफ या एक्सएसआरएफ) हमलों को prevent लिए Authenticity Token रेल की विधि है।

इसे सरल बनाने के लिए, यह सुनिश्चित करता है कि PUT / POST / DELETE (विधियां जो सामग्री को संशोधित कर सकती हैं) आपके वेब ऐप के अनुरोध क्लाइंट के ब्राउज़र से बनाई गई हैं, न कि किसी तृतीय पक्ष (एक हमलावर) से जो कुकी द्वारा बनाई गई है ग्राहक पक्ष पर।


न्यूनतम हमला उदाहरण जो रोका जाएगा

मेरी वेबसाइट evil.com मैं आपको निम्नलिखित फॉर्म जमा करने के लिए evil.com हूं:

<form action="http://bank.com/transfer" method="post">
  <p><input type="hidden" name="to"      value="ciro"></p>
  <p><input type="hidden" name="ammount" value="100"></p>
  <p><button type="submit">CLICK TO GET PRIZE!!!</button></p>
</form>

यदि आप सत्र कुकीज़ के माध्यम से अपने बैंक में लॉग इन हैं, तो कुकीज़ भेजी जाएगी और हस्तांतरण आपके बिना भी जानेगा।

सीएसआरएफ टोकन खेल में आता है:

  • जीईटी प्रतिक्रिया के साथ कि फॉर्म वापस लौटा, रेल एक बहुत लंबा यादृच्छिक छुपा पैरामीटर भेजता है
  • जब ब्राउज़र POST अनुरोध करता है, तो यह पैरामीटर के साथ भेज देगा, और सर्वर केवल तभी स्वीकार करेगा जब यह मेल खाता हो

तो एक प्रामाणिक ब्राउज़र पर फॉर्म इस तरह दिखेगा:

<form action="http://bank.com/transfer" method="post">
  <p><input type="hidden" name="authenticity_token" value="j/DcoJ2VZvr7vdf8CHKsvjdlDbmiizaOb5B8DMALg6s=" ></p>
  <p><input type="hidden" name="to"                 value="ciro"></p>
  <p><input type="hidden" name="ammount"            value="100"></p>
  <p><button type="submit">Send 100$ to Ciro.</button></p>
</form>

इस प्रकार, मेरा हमला असफल हो जाएगा, क्योंकि यह authenticity_token पैरामीटर नहीं भेज रहा था, और ऐसा कोई तरीका नहीं है कि मैं इसे अनुमान लगा सकता हूं क्योंकि यह एक बड़ी यादृच्छिक संख्या है।

इस रोकथाम तकनीक को सिंक्रनाइज़र टोकन पैटर्न कहा जाता है।

सिंक्रनाइज़र टोकन पैटर्न समान उत्पत्ति नीति के कारण काम करता है: यदि मैं evil.com . evil.com से आपके बैंक को XHR GET अनुरोध कर सकता evil.com , और परिणाम पढ़ सकता हूं, तो मैं केवल टोकन पढ़ सकता हूं और फिर बाद में अनुरोध कर सकता हूं। मैंने इसे आगे समझाया है: https://security.stackexchange.com/a/72569/53321

मैं आपको इस पर और किसी भी अन्य सुरक्षा मामले पर ओडब्ल्यूएएसपी गाइड पढ़ने की सलाह देता हूं।

रेल कैसे टोकन भेजता है

इसमें शामिल: रेल: csrf_meta_tag कैसे काम करता है?

मूल रूप से:

  • HTML मददगार जैसे form_tag आपके लिए फ़ॉर्म में एक छुपा फ़ील्ड जोड़ें यदि यह एक GET फॉर्म नहीं है

  • AJAX को jquery-ujs द्वारा स्वचालित रूप से निपटाया जाता है, जो csrf_meta_tags (डिफ़ॉल्ट टेम्पलेट में मौजूद) द्वारा आपके शीर्षलेख में जोड़े गए meta तत्वों से टोकन को पढ़ता है, और इसे किसी भी अनुरोध में जोड़ता है।

    यूजेएस पुराने कैश किए गए टुकड़ों में फॉर्म में टोकन को अपडेट करने का भी प्रयास करता है।

अन्य रोकथाम दृष्टिकोण


विधि जहां authenticity_token आवश्यक है

authenticity_token को पोस्ट, डालने और हटाने जैसी बेवकूफ विधियों के मामले में आवश्यक है, क्योंकि Idempotent विधियां डेटा को प्रभावित कर रही हैं।

यह क्यों जरूरी है

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





authenticity-token