[Ruby-On-Rails] रेल प्रामाणिकता टोकन को समझना



Answers

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

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

<%= form_authenticity_token %>

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

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

Question

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

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




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

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

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

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

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

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




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

 <%= token_tag nil %>

बनाना

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

कहीं भी




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

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=" />

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

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

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




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

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






Links