2016-08-10 6 views
8

एक रेल के एक ही पेज 4 एप्लिकेशन पर पर authenticity_token मैं एकरेल CSRF बनाम एक रूप टोकन

सिर में

है:

<meta name="csrf-param" content="authenticity_token" /> 
<meta name="csrf-token" content="some_token" /> 

और नीचे शरीर में:

<form action="/someaction" method="post"> 
<input name="utf8" type="hidden" value="&#x2713;" /> 
<input type="hidden" name="_method" value="patch" /> 
<input type="hidden" name="authenticity_token" value="another_token" /> 

जेएस कॉल के लिए सीएसआरएफ टोकन की आवश्यकता है। लेकिन फार्म टोकन सीएसआरएफ टोकन से अलग क्यों है? फॉर्म जमा करने पर दो टोकन का उपयोग किस प्रकार किया जाता है?

उत्तर

0

मैंने आपके प्रश्न का उत्तर देने के लिए कुछ शोध किए हैं, और यहां परिणाम हैं।

सबसे पहले, के इस भाग को देखो:

<meta name="csrf-param" content="authenticity_token" /> 
<meta name="csrf-token" content="some_token" /> 

इस भाग विधि csrf_meta_tags द्वारा उत्पन्न होता है। स्रोत कोड से हम देख सकते हैं कि:

  1. "सामग्री" <meta name="csrf-param" /> की विशेषता मान request_forgery_protection_token से लिया जाता है, और डिफ़ॉल्ट रूप से, :authenticity_token है।

  2. <meta name="csrf-token" /> की "सामग्री" विशेषता मान form_authenticity_token विधि से लिया गया है, जहां टोकन या तो सत्र से लिया जाता है, या जेनरेट किया जाता है। हम देख सकते हैं कि

    <input type="hidden" name="authenticity_token" value="another_token" /> 
    

    स्रोत से::

अब इस हिस्से की जाँच करते हैं

  1. इसमें छिपे हुए इनपुट extra_tags_for_form विधि द्वारा दिया जाता है।
  2. extra_tags_for_form के अंदर token_tag विधि का आह्वान करता है।
  3. token_tag विधि तर्क के रूप में टोकन लेता है।
  4. tokentoken_tag के लिए तर्क optionsform_tag विधि html_options_for_form विधि में विधि से निकाला गया है।

तो अगर आप ऐसा नहीं किया मैन्युअल रूप से आपका टोकन के options में authenticity_token परम सेट और स्थिति है कि (नीचे उल्लेख किया जाएगा) गलत पर token मान सेट करने के लिए नेतृत्व को पूरा नहीं किया, token_tag विधि nil प्राप्त होगा और उसी form_authenticity_token विधि का आह्वान करें जिसका उपयोग <meta name="csrf-token" /> टैग बनाने के लिए किया जाता है। वैसे, name इनपुट की विशेषता भरने के लिए यह request_forgery_protection_token का भी उपयोग करता है, जिसका उपयोग <meta name="csrf-param" /> टैग पीढ़ी के दौरान किया जाता है।

और क्योंकि यह सब एक ही अनुरोध के दौरान होता है, form_authenticity_token विधि का आविष्कार दोनों मामलों में एक ही परिणाम वापस करना चाहिए।

फॉर्म जमा करने पर दो टोकन का उपयोग किस प्रकार किया जाता है?

फॉर्म सबमिशन पर छुपा इनपुट से टोकन का उपयोग किया जाएगा।

conditions नीचे के सभी (कि token_tag विधि के token तर्क गलत पर सेट किया जा कर) को पूरा किया जाएगा

<meta /> भी से टोकन इस्तेमाल किया जा सकता है, लेकिन केवल यदि:

  1. :remote => trueform_tag की options में पारित किया जाना चाहिए ।
  2. embed_authenticity_token_in_remote_forms कॉन्फ़िगरेशन गलत पर सेट है।
  3. authenticity_tokenoptions में पारित नहीं किया गया था।

लेकिन फार्म टोकन सीएसआरएफ टोकन से अलग क्यों है?

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

+0

धन्यवाद। मुझे जवाब देखने और समझने के लिए कुछ समय चाहिए। – thebravoman

+0

@thebravoman क्या यह सहायक था? –

+0

यह था, मुझे इसे पूरी तरह समझने की कोशिश करने के लिए बस मेरे आवेदन के साथ कुछ चीजों का परीक्षण करने की आवश्यकता है – thebravoman

संबंधित मुद्दे