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


982

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

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


7
यह भी देखें: "Google अपने JSON प्रतिक्रिया के दौरान (1) क्यों प्रीपेंड करता है?" stackoverflow.com/questions/2669690/…
च्लोए

जवाबों:


1462

क्या होता है

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

क्यों होता है?

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

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

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

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

टिप्पणियाँ

ध्यान रखें, रेलें केवल बेकार तरीकों (POST, PUT / PATCH और DELETE) की पुष्टि नहीं करती हैं। प्रामाणिकता टोकन के लिए GET अनुरोध की जाँच नहीं की जाती है। क्यों? क्योंकि HTTP विनिर्देशन कहा गया है कि अनुरोध प्राप्त idempotent है और चाहिए नहीं बनाते हैं, बदलने, या सर्वर पर संसाधनों को नष्ट, और अनुरोध idempotent होना चाहिए (यदि आप एक ही आदेश कई बार चलाने के लिए, आप एक ही परिणाम हर बार मिलना चाहिए)।

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

पाठ

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


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


25
@ फैसल, क्या यह संभव है, एक हमलावर के लिए सेवा ए के लिए फ़ॉर्म के 'छिपे हुए' तत्व को केवल पढ़ने / कैप्चर करने के लिए और उपयोगकर्ता के लिए उस अद्वितीय टोकन को प्राप्त करें - जिसे उन्होंने उपयोगकर्ता द्वारा शुरू किए गए सत्र तक पहुंच प्रदान की है। सेवा ए के लिए?
marcamillion

11
@marcamillion: यदि किसी ने आपके सत्र को सेवा A पर अपहरण कर लिया है, तो प्रामाणिकता टोकन आपकी रक्षा नहीं करेगा। अपहर्ता अनुरोध प्रस्तुत करने में सक्षम होगा और उसे आगे बढ़ने की अनुमति दी जाएगी।
फैसल

12
@ ज़ब्बा: रेल एक एक्शनकंट्रोलर उठाती है :: यदि कोई फॉर्म बिना टोकन के सबमिट किया जाता है, तो अमान्य अमान्य टैक्सटॉक अपवाद। आप अपवाद से बचाव कर सकते हैं और जो भी प्रसंस्करण चाहते हैं उसे करें।
फैसल

5
पुनः "यह भी सुनिश्चित करें कि कोई भी GET अनुरोध न करें जो संभवतः सर्वर पर संसाधनों को संशोधित कर सके।" - इसमें उन मार्गों का मिलान () का उपयोग नहीं करना शामिल है जो संभावित रूप से केवल POST प्राप्त करने के लिए नियंत्रक कार्यों के लिए GET अनुरोधों की अनुमति दे सकते हैं
स्टीवन सोरोका

102
"... और अनुरोध को आदर्श होना चाहिए (यदि आप एक ही कमांड को कई बार चलाते हैं, तो आपको हर बार एक ही परिणाम प्राप्त करना चाहिए)।" बस एक सूक्ष्म स्पष्टीकरण यहाँ। सुरक्षित का अर्थ है कोई दुष्प्रभाव। Idempotent का मतलब है कि एक ही साइड इफेक्ट कोई फर्क नहीं पड़ता कि किसी सेवा को कितनी बार कहा जाता है। सभी सुरक्षित सेवाएं स्वाभाविक रूप से उदासीन हैं क्योंकि कोई दुष्प्रभाव नहीं हैं। वर्तमान समय संसाधन पर GET को कॉल करने से कई बार हर बार एक अलग परिणाम प्राप्त होता है, लेकिन यह सुरक्षित है (और इस प्रकार idempotent)।
इर्टर्न

137

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

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

<%= form_authenticity_token %>

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

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


88

CSRF क्या है?

ऑथेंटिसिटी टोकन क्रॉस-साइट रिक्वेस्ट फॉरेरी (CSRF) के लिए एक प्रतिवाद है। CSRF क्या है, आप पूछें

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

परिदृश्य :

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

CSRF समाधान :

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

1
यहाँ इसी स्पष्टीकरण का एक संस्करण है जो कम सटीक है, लेकिन कम सार भी है: stackoverflow.com/a/33829607/2810305
लुत्ज़ प्रेचल

मुझे यकीन नहीं है लेकिन, क्या आधुनिक ब्राउज़रों को किसी अन्य डोमेन पर बेकार अनुरोध (POST / PUT / DELETE) भेजने की अनुमति नहीं है? मुझे लगता है, ब्राउज़र में ही ऐसी चीजों से सुरक्षा होनी चाहिए
divideByZero

45

न्यूनतम हमले का उदाहरण जिसे रोका जाएगा: CSRF

अपनी वेबसाइट पर 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पैरामीटर नहीं भेज रहा था , और ऐसा कोई तरीका नहीं है जिससे मैं अनुमान लगा सकता था क्योंकि यह एक विशाल यादृच्छिक संख्या है।

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

एक ही मूल नीति

लेकिन क्या होगा अगर हमलावर ने जावास्क्रिप्ट के साथ दो अनुरोध किए, एक टोकन पढ़ने के लिए, और दूसरा हस्तांतरण करने के लिए?

अकेले तुल्यकालन टोकन पैटर्न को रोकने के लिए पर्याप्त नहीं है!

यह वही जगह है जहां समान उत्पत्ति नीति बचाव में आती है, जैसा कि मैंने यहां बताया है: /security/8264/why-is-the-same-origin-policy-so-imantant/72569# 72,569

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

पर कवर: रेल: कैसे csrf_meta_tag काम करता है?

मूल रूप से:

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

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

    UJS पुराने कैश्ड अंशों में रूपों में टोकन को अपडेट करने का भी प्रयास करता है।

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


धन्यवाद, लेकिन सीएसआरएफ टोकन को पहले पढ़ने में सक्षम नहीं होने के लिए एक ही मूल नीति पर भरोसा करने के बारे में आपकी बात पहले त्रुटिपूर्ण लगती है। तो पहले आप कह रहे हैं कि आप एक अलग मूल पर पोस्ट कर सकते हैं, लेकिन इससे पढ़ नहीं सकते, अजीब लगता है, लेकिन मुझे लगता है कि यह सही है, लेकिन आप पेज के लिए एक छवि या स्क्रिप्ट टैग को इंजेक्ट कर सकते हैं और एक हैंडलर को पार्स प्रतिक्रिया से जोड़ सकते हैं और यह हाँ?
bjm88

@ bjm88 स्क्रिप्ट को कहां इंजेक्ट करें? आपकी साइट पर, या हमले वाली साइट पर? यदि साइट पर हमला किया जाता है, तो स्क्रिप्ट इंजेक्शन की अनुमति देना एक प्रसिद्ध सुरक्षा दोष है, और प्रभावी रूप से वेबसाइट को सक्रिय करता है। हर वेबसाइट को इनपुट सेनिटेशन के जरिए इससे लड़ना होगा। छवियों के लिए, मैं यह नहीं देखता कि हमले के लिए उनका उपयोग कैसे किया जा सकता है। आक्रमण करने वाली साइट पर: आप अपने ब्राउज़र को पढ़ने की अनुमति देने के लिए संशोधित कर सकते हैं, और इस तरह स्वयं को मोशन में छोड़ देंगे :-) लेकिन सभ्य ब्राउज़र इसे डिफ़ॉल्ट रूप से रोकते हैं, इसे आज़माएं।
सिरो सेंटिल्ली 冠状 iro iro i

43

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

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डोमेन के लिए अनुरोध करता है, सभी कुकीज़ को साथ भेज दिया जाता है। जिसमें session_idकुकी भी शामिल है ।

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

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

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

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

यहां छवि विवरण दर्ज करें

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

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

ये इतना भी बुरा नहीं। केवल GET अनुरोध असुरक्षित हैं।

सच नहीं। एक फॉर्म जो 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=" />

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

एक हमलावर को कैसे पता होना चाहिए कि यह टोकन क्या है? प्रपत्र उत्पन्न होने पर हर बार एक अलग मान उत्पन्न होता है:

यहां छवि विवरण दर्ज करें

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


39

Authenticity Tokenरेल 'के लिए विधि है को रोकने के क्रॉस साइट अनुरोध जालसाजी (CSRF या XSRF) हमलों' '

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


34

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

 <%= token_tag nil %>

बनाना

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

कहीं भी


यह मेरे लिए मददगार था। मैं वास्तव XSSमें लॉगिन पृष्ठ पर करने की कोशिश कर रहा था , नापाक उद्देश्यों के लिए नहीं, बल्कि पहले से भरे उपयोगकर्ता नाम के साथ एक नया सत्र बनाने के लिए। अब मुझे पता है कि मैं सिर्फ उपयोग कर सकता हूं value="token_value"
माइकल - कहाँ है क्ले शिर्क

27

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


11

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

authenticity_token पोस्ट, पुट और डिलीट जैसे इम्पोटेंट तरीकों के मामले में आवश्यक है, क्योंकि इम्पोटेंट तरीके डेटा को प्रभावित कर रहे हैं।

यह क्यों आवश्यक है

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


3
वास्तव में, क्या यह विपरीत नहीं है? जीईटी एक तरह से वैचारिक है क्योंकि इसकी कॉल प्रणाली की स्थिति में बदलाव नहीं करना चाहिए, जहां सिस्टम पोस्ट को बदलने के बाद से पीयूटी पोस्ट और DELETE क्रियाएं नहीं हैं। IE: प्रमाणिक विधियों के मामले में प्रामाणिकता_टोकन की आवश्यकता होती है।
जीन-थियो

2
@ जीन-ड्यूब, uma: idempotent का अर्थ है कि यदि दो बार किया जाता है, तो कार्रवाई केवल एक बार होती है। मिलता है, PUT और हटाने के हैं idempotent: w3.org/Protocols/rfc2616/rfc2616-sec9.html कुंजी संपत्ति यहाँ idempotency नहीं है, लेकिन अगर विधि में परिवर्तन या नहीं डेटा है, जो कहा जाता है "सुरक्षित विधि" है या नहीं।
सिरो सेंटिल्ली 冠状 病毒 i i 法轮功

6

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

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

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

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

ऑथेंटिकेशन_टोकन को फॉर्म में कैसे जोड़ें?

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.