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




authenticity-token (9)

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

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

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

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

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

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


क्या होता है

जब उपयोगकर्ता किसी संसाधन को बनाने, अपडेट करने या नष्ट करने के लिए कोई फॉर्म देखता है, तो रेल ऐप एक यादृच्छिक 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 द्वारा टिप्पणी की जांच करें । उन्होंने इसे यहां से बेहतर तरीके से समझाया है।


क्रॉस-साइट अनुरोध फोर्जरी हमलों (सीएसआरएफ) को रोकने के लिए प्रामाणिकता टोकन का उपयोग किया जाता है। प्रामाणिकता टोकन को समझने के लिए, आपको पहले सीएसआरएफ हमलों को समझना होगा।

CSRF

मान लीजिए कि आप bank.com के लेखक हैं। आपके पास अपनी साइट पर एक फॉर्म है जिसका उपयोग किसी जीईटी अनुरोध के साथ किसी दूसरे खाते में धन हस्तांतरण करने के लिए किया जाता है:

एक हैकर सर्वर को HTTP अनुरोध भेज सकता है जो कहता है कि GET /transfer?amount=$1000000&account-to=999999 , है ना?

गलत। हैकर्स हमला काम नहीं करेगा। सर्वर मूल रूप से सोचेंगे?

है ना? यह आदमी कौन हस्तांतरण शुरू करने की कोशिश कर रहा है। यह खाते का मालिक नहीं है, यह निश्चित रूप से है।

सर्वर यह कैसे जानता है? क्योंकि अनुरोधकर्ता को प्रमाणित करने वाला कोई session_id कुकी नहीं है।

जब आप अपने उपयोगकर्ता नाम और पासवर्ड से साइन इन करते हैं, तो सर्वर आपके ब्राउज़र पर session_id कुकी सेट करता है। इस तरह, आपको अपने उपयोगकर्ता नाम और पासवर्ड के साथ प्रत्येक अनुरोध को प्रमाणित करने की आवश्यकता नहीं है। जब आपका ब्राउज़र session_id कुकी भेजता है, तो सर्वर जानता है:

ओह, वह जॉन डो है। उन्होंने 2.5 मिनट पहले सफलतापूर्वक हस्ताक्षर किए। वह जाने के लिए अच्छा है।

एक हैकर सोच सकता है:

हम्म। एक सामान्य HTTP अनुरोध काम नहीं करेगा, लेकिन अगर मैं उस session_id कुकी पर अपना हाथ प्राप्त कर सकता हूं, तो मैं सुनहरा होगा।

उपयोगकर्ता ब्राउज़र में bank.com . bank.com डोमेन के लिए कुकीज़ सेट का एक गुच्छा है। हर बार जब उपयोगकर्ता bank.com . bank.com डोमेन से अनुरोध करता है, तो सभी कुकीज़ साथ भेजी जाती हैं। session_id कुकी सहित।

तो यदि कोई हैकर आपको जीईटी अनुरोध करने के लिए प्राप्त कर सकता है जो उसके खाते में पैसा स्थानांतरित करता है, तो वह सफल होगा। वह ऐसा करने में आपको कैसे चाल सकता है? क्रॉस साइट अनुरोध फोर्जरी के साथ।

वास्तव में यह वास्तव में बहुत आसान है। हैकर आपको बस अपनी वेबसाइट पर जा सकता है। अपनी वेबसाइट पर, उसके पास निम्न छवि टैग हो सकता है:

<img src="http://bank.com/transfer?amount=$1000000&account-to=999999">

जब उपयोगकर्ता ब्राउज़र उस छवि टैग पर आता है, तो वह उस यूआरएल को एक GET अनुरोध कर देगा। और चूंकि अनुरोध अपने ब्राउज़र से आता है, यह bank.com . bank.com जुड़े सभी कुकीज़ के साथ bank.com । यदि उपयोगकर्ता ने हाल ही में bank.com में साइन इन किया bank.com ... session_id कुकी सेट की जाएगी, और सर्वर सोचता है कि उपयोगकर्ता bank.com खाते में $ 1,000,000 स्थानांतरित करने का मतलब था!

खैर, बस खतरनाक साइटों पर न जाएं और आप ठीक होंगे।

वह पर्याप्त नहीं है। क्या होगा अगर कोई उस छवि को फेसबुक पर पोस्ट करता है और यह आपकी दीवार पर दिखाई देता है? क्या होगा यदि यह किसी एक्सएसएस हमले के साथ आपकी साइट पर इंजेक्शन दिया गया हो?

ये इतना भी बुरा नहीं। केवल अनुरोध प्राप्त कमजोर हैं।

सच नहीं। एक पोस्ट जो POST अनुरोध भेजता है गतिशील रूप से जेनरेट किया जा सकता है। सुरक्षा पर रेल गाइड से उदाहरण यहां दिया गया है :

<a href="http://www.harmless.com/" onclick="
  var f = document.createElement('form');
  f.style.display = 'none';
  this.parentNode.appendChild(f);
  f.method = 'POST';
  f.action = 'http://www.example.com/account/destroy';
  f.submit();
  return false;">To the harmless survey</a>

प्रामाणिकता टोकन

जब आपके ApplicationController पास यह है:

protect_from_forgery with: :exception

इस:

<%= form_tag do %>
  Form contents
<% end %>

इसमें संकलित है:

<form accept-charset="UTF-8" action="/" method="post">
  <input name="utf8" type="hidden" value="&#x2713;" />
  <input name="authenticity_token" type="hidden" value="J7CBxfHalt49OSHp27hblqK20c9PgwJ108nDHX/8Cts=" />
  Form contents
</form>

विशेष रूप से, निम्नलिखित उत्पन्न होता है:

<input name="authenticity_token" type="hidden" value="J7CBxfHalt49OSHp27hblqK20c9PgwJ108nDHX/8Cts=" />

सीएसआरएफ हमलों के खिलाफ सुरक्षा के लिए, यदि रेल को अनुरोध के साथ भेजे गए प्रामाणिकता टोकन को नहीं देखा जाता है, तो यह अनुरोध सुरक्षित नहीं मानेगा।

एक हमलावर को यह पता होना चाहिए कि यह टोकन क्या है? फ़ॉर्म उत्पन्न होने पर प्रत्येक बार यादृच्छिक रूप से एक अलग मूल्य उत्पन्न होता है:

एक क्रॉस साइट स्क्रिप्टिंग (एक्सएसएस) हमला - यह कैसे है। लेकिन यह एक अलग दिन के लिए एक अलग भेद्यता है।


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

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

<%= form_authenticity_token %>

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

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


प्रमाणीकरण_टोकन क्या है?

यह रेल एप्लिकेशन द्वारा उपयोग की जाने वाली यादृच्छिक स्ट्रिंग है यह सुनिश्चित करने के लिए कि उपयोगकर्ता ऐप पेज से कोई कार्रवाई कर रहा है या कोई ऐप कर रहा है, न कि किसी अन्य ऐप या साइट से।

प्रमाणीकरण_टोकन क्यों आवश्यक है?

क्रॉस-साइट अनुरोध जालसाजी से अपने ऐप या साइट की सुरक्षा के लिए।

किसी प्रपत्र में प्रमाणीकरण_टोकन कैसे जोड़ें?

यदि आप form_for टैग का उपयोग कर फ़ॉर्म बना रहे हैं तो प्रमाणीकरण_टोकन स्वचालित रूप से जोड़ा जाता है और आप <%= csrf_meta_tag %> उपयोग कर सकते हैं।


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

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

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

परिदृश्य :

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

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

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

यदि आपके पास एक ही ग्राहक से एकाधिक, समवर्ती अनुरोध हैं तो प्रामाणिकता टोकन तंत्र से सावधान रहें। इस स्थिति में आपका सर्वर एकाधिक प्रामाणिकता टोकन उत्पन्न कर सकता है जब केवल एक होना चाहिए, और किसी प्रपत्र में पहले टोकन प्राप्त करने वाला क्लाइंट इसके अगले अनुरोध पर असफल हो जाएगा क्योंकि सत्र कुकी टोकन ओवरराइट कर दिया गया है। इस समस्या पर एक लिखना है और यहां एक पूरी तरह से मामूली समाधान नहीं है: http://www.paulbutcher.com/2007/05/race-conditions-in-rails-sessions-and-how-to-fix-them/ सत्र-and-how-to-fix-them http://www.paulbutcher.com/2007/05/race-conditions-in-rails-sessions-and-how-to-fix-them/


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

 <%= token_tag nil %>

बनाना

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

कहीं भी


यह रेल में एक सुरक्षा सुविधा है। कोड में इस पंक्ति को फॉर्म में जोड़ें:

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>

दस्तावेज़ीकरण यहां पाया जा सकता है: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html





ruby-on-rails ruby authenticity-token