7

我想用这个函数$this->security->get_csrf_hash();的值设置名称为csrf_cookie_name的 cookie;但是,它不起作用。

我的控制器中有这个:

   $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;

我工作,并回显了一个生成的字符串。

因此,我假设接下来的两行中的某些内容是错误的:

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

谢谢你的建议。

4

3 回答 3

20

您需要指定 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)
于 2012-09-21T09:26:59.993 回答
7

您没有得到 cookie 回显的原因是该$this->input->cookie()函数直接从全局$_COOKIE数组中读取,并且$this->input->set_cookie()不会$_COOKIE立即在服务器上填充该数组。相反,$this->input->set_cookie()将 cookie 排队以发送回并存储在浏览器中。只有在用户的下一个 HTTP 请求时,您才能重新观察此 cookie。

其次,也许更重要的是,我认为您不正确地使用了 csrf cookie。为了防止跨站点请求伪造,只需要您启用它并将其属性设置为config/config.php. 这就对了。根本不需要在控制器中读写它。

于 2012-09-16T18:10:26.537 回答
3

cookie 已经在那里了。您可以通过 Javascript 进行咨询:

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

我希望有用。

于 2012-09-22T12:16:36.507 回答