2012-09-16 78 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"); ?>"); 

希望对大家有用。