2012-09-16 12 views
7

में काम नहीं कर रहा कुकी इस समारोह से एक मूल्य के साथ csrf_cookie_name एक नाम के साथ सेट करना चाहते $ this-> सुरक्षा-> get_csrf_hash(); लेकिन, यह काम नहीं कर रहा है।स्थापना कुकीज़ CodeIgniter

मैं अपने नियंत्रक में इस है:

$csrf_cookie_value = $this->security->get_csrf_hash(); 
    $this->input->set_cookie('csrf_cookie_name', $csrf_cookie_value); 
    echo $this->input->cookie('csrf_cookie_name'); 
    die(); 

लेकिन यह काम नहीं कर रहा है और कुछ भी बाहर गूँजती है।

अगर मैं केवल इस प्रयास करें:

$csrf_cookie_value = $this->security->get_csrf_hash(); 
echo $csrf_cookie_value; 

मैं काम करता है और एक उत्पन्न स्ट्रिंग बाहर गूँजती है।

तो, मुझे लगता है कि इन अगले 2 लाइनों के भीतर कुछ गलत है:

$this->input->set_cookie('csrf_cookie_name', $csrf_cookie_value); 
echo $this->input->cookie('csrf_cookie_name'); 

आपकी सलाह के लिए धन्यवाद।

+2

यह भी सुनिश्चित नहीं है कि यह PHP में कैसे काम करता है, लेकिन मेरा अनुमान यह है कि जब आप कुकी को आजमाते हैं और पढ़ते हैं तो यह अनुरोध शीर्षलेखों से पढ़ रहा है और जाहिर है कि जब अनुरोध किया गया था तो कुकी सेट नहीं की गई थी। एक बार प्रतिक्रिया भेजी जाती है कि कुकीज़ को कुकी में सेट किया गया है या नहीं। आगे के अनुरोधों को कुकी मूल्य को सही ढंग से पढ़ना चाहिए .. नोट मैं गलत हो सकता हूं .. – Baz1nga

+0

मैंने इसे $-> इनपुट-> set_cookie ('csrf_cookie_name', $ csrf_cookie_value) के साथ सेट किया है; इससे पहले कि मैंने इसे गूंजने की कोशिश की। – Derfder

+0

मुझे पता है कि आपके पास है .. एचटीपी अनुरोध और प्रतिक्रिया के बारे में पढ़ने पर विचार करें और कुकीज़ कैसे काम करती हैं .. – Baz1nga

उत्तर

7

कारण आप एक कुकी प्रतिध्वनित नहीं हो रही है $this->input->cookie() समारोह वैश्विक $_COOKIE सरणी से सीधे पढ़ता है और $this->input->set_cookie() सर्वर पर तुरंत $_COOKIE सरणी पॉप्युलेट नहीं करता है क्योंकि है। इसके बजाय, $this->input->set_cookie() कुकी को वापस भेजने और ब्राउज़र में संग्रहीत करने के लिए कतारबद्ध करता है। केवल उपयोगकर्ताओं के अगले HTTP अनुरोध पर आप इस कुकी को फिर से देख पाएंगे।

दूसरा, और शायद अधिक महत्वपूर्ण बात यह है कि मुझे लगता है कि आप सीएसआरएफ कुकी का अनुचित तरीके से उपयोग कर रहे हैं। क्रॉस साइट अनुरोध फर्जी के खिलाफ सुरक्षा के लिए केवल आपको इसे सक्षम करने और config/config.php में इसकी गुणों को सेट करने की आवश्यकता है। बस इतना ही। नियंत्रकों में इसे पढ़ने और लिखने की कोई आवश्यकता नहीं है।

+0

मैं इसे लिंक में उपयोग नहीं कर रहा हूं, इसलिए मुझे इसे सीधे एक्सेस करने की आवश्यकता है। – Derfder

19

आपको कुकी के लिए जीवनकाल निर्दिष्ट करने की आवश्यकता है। 0 एक सत्र कुकी होगी और कुछ भी time() में जोड़ा जाएगा।

यदि आप जीवन समय निर्दिष्ट नहीं करते हैं, तो सीआई व्याख्या करेगा कि आप कुकी कुकी को हटाना चाहते हैं। और उस कुकी पहले से ही वहाँ है, यह वास्तव में क्या करता है :)

$this->input->set_cookie('name', 'value', 0); //expires when the browser window closes 
$this->input->set_cookie('name', 'value', 3600); //expires in one hour 
$this->input->set_cookie('name', 'value');  //will delete the cookie (if the cookie does not exist, you will not notice anything happening) 
+1

यह सही है, आपको एक समाप्ति तिथि की आवश्यकता है। यदि आप एक सेट नहीं करते हैं (या एक गैर संख्यात्मक मान भेजा जाता है) इनपुट लाइब्रेरी अतीत में एक समाप्ति तिथि निर्धारित करेगी (जहां तक ​​मैं कह सकता हूं कि इसे बिल्कुल सेट नहीं किया गया है) –

3

। आप जावास्क्रिप्ट के माध्यम से परामर्श कर सकते हैं:

$.cookie("<?php echo $this->config->item("csrf_cookie_name"); ?>"); 

मुझे आशा है कि उपयोगी हो।