2016-04-25 8 views
6

मैं रेल में पूर्ण पृष्ठ कैशिंग प्राप्त करने का प्रयास कर रहा हूं लेकिन मैंने सीएसआरएफ के संबंध में एक झगड़ा मारा है - या शायद इसकी मेरी समझ। मेरे पास वर्तमान में form_authenticity_token स्ट्रिंग है जो एक कुकी में संग्रहीत है जो जेएस हेडर टैग को एक्सेस और रीराइट कर सकता है।रेल 4 प्रामाणिकता टोकन - दोनों शीर्षलेख और छिपी हुई इनपुट में?

दो स्थानों पर मैं अपने सृजित HTML में टोकन खोजने के होते हैं:

1) सिर

<meta name="csrf-token" content="[hash]">

2) में एक फार्म के छिपे इनपुट तत्व के अंदर

<input type="hidden" name="authenticity_token" value="[different hash]">

जैसा कि इंगित किया गया है, ये हैंश एक दूसरे से अलग हैं (विकास मोड में जहां कैशिंग एनबेल नहीं है ईडी)। वे अलग क्यों हैं? ऐसा क्यों है कि मैं सिर मेटा टैग को हटा सकता हूं और फ़ॉर्म इनपुट अकेले छोड़ सकता हूं और अनुरोध की अनुमति है? फिर भी जब मैं फॉर्म इनपुट टैग हटा देता हूं और हेडर छोड़ देता हूं तो अनुरोध अस्वीकार कर दिया जाता है?

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

आवेदन नियंत्रक शामिल हैं:

protect_from_forgery with: :exception 
before_filter :csrf_cookie 

def csrf_cookie 
    cookies['authenticity-token'.freeze] = { 
    value: form_authenticity_token, 
    expires: 1.day.from_now, 
    secure: (Rails.env.staging? || Rails.env.production?) 
    } 
end 

उत्तर

2

एक और मुद्दा led me to the answer पर एसओ ब्राउज़िंग। संक्षेप में, रेल एजेक्स अनुरोधों में स्वचालित रूप से सीएसआरएफ टोकन डालने से jQuery उपयोगकर्ताओं को मदद करता है। यह मेटा टैग में इसकी तलाश करता है।

तो फॉर्म के अंदर सीएसआरएफ टोकन रखने के लिए POST अनुरोध सबमिट करते समय और सिर में होने के लिए उपयोगी है AJAX अनुरोधों के साथ समय/प्रयास/गलतियों को बचाने के लिए उपयोगी है।

शायद यह दोनों में भी अच्छा है क्योंकि आप कोई फॉर्म मौजूद नहीं होने पर AJAX अनुरोध करना चाह सकते हैं। यदि कोई फॉर्म है और जावास्क्रिप्ट अक्षम है, तो इसे हेडर में रखने से कोई भी पक्ष नहीं करता है क्योंकि इसे POST अनुरोध में शामिल नहीं किया जाएगा।

क्यों वे अलग हैं, मैं केवल अनुमान लगा सकता हूं कि पीढ़ी के समय एल्गोरिदम के साथ इसका कुछ संबंध है ... लेकिन यह न तो यहां और न ही दोनों टोकन काम करते हैं।

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