2012-09-16 165 views
7

我想用名稱設置cookie csrf_cookie_name使用此函數的值$ this-> security-> get_csrf_hash();但它不起作用。設置cookie在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中工作的,但我的猜測是,當您嘗試閱讀cookie時,它正在從請求頭中讀取,顯然它不會出現,因爲請求時沒有設置cookie。 。檢查一次發送的響應是否在瀏覽器中設置cookie。進一步的請求應該正確地讀取cookie值..注意我可能是錯誤的.. – Baz1nga

+0

我已經設置它$ this-> input-> set_cookie('csrf_cookie_name',$ csrf_cookie_value);在我試圖迴應它之前。 – Derfder

+0

我知道你有..考慮閱讀有關Http請求和響應以及如何使用Cookie .. – Baz1nga

回答

7

你沒有得到一個cookie呼應原因是因爲$this->input->cookie()功能,直接從全球$_COOKIE陣列讀取和$this->input->set_cookie()不會立即填充$_COOKIE陣列的服務器上。取而代之的是,$this->input->set_cookie()將cookie發回並存儲在瀏覽器中。只有在用戶的下一個HTTP請求中,您才能夠重新觀察此cookie。

其次,也許更重要的是,我認爲你不正確地使用csrf cookie。爲防止跨站點請求僞造,只需要啓用它並將其屬性設置爲config/config.php即可。這就對了。根本不需要讀寫控制器。

+0

我在鏈接中不使用它,所以我需要直接訪問它。 – Derfder

19

您需要指定cookie的生存時間。 0將是會話cookie,其他任何內容都將添加到time()

如果你沒有指定生命期,CI會解釋你想要的刪除的cookie。而這正是它:)

$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已經存在。您可以通過以下方式使用Javascript進行諮詢:

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

希望對大家有用。