安全性cookie_secure CSRF无法正常工作

时间:2015-02-04 14:55:47

标签: php codeigniter cookies csrf

我目前正在使用Codeigniter,并希望在config.php中启用:

$config['cookie_secure']    = TRUE; 

我也在使用:

$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = '***';
$config['csrf_cookie_name'] = '***';
$config['csrf_expire'] = 7200;

连接仅限https。但是当我使用cookie_secure选项时,CSRF不再起作用了,并给出了:

The action you have requested is not allowed.

由于此措施,Codeigniter无法将CSRF存储在Cookie中。我该如何解决?我喜欢使用这两种安全措施。

< --- EDIT --->

<form action="<?php echo base_url().'login/'; ?>" method="post">

  <?php echo form_hidden($this->security->get_csrf_token_name(), $this->security->get_csrf_hash()); ?>

3 个答案:

答案 0 :(得分:1)

当我将null设置为 true i设置为 true 时,我遇到了同样的问题。

我首先注意到的是没有设置CSRF cookie。

查看cookie_secure中的csrf_protection功能,您会看到:

csrf_set_cookie()

虽然像大多数人一样,我使用负载均衡器进行SSL终止。各个服务器不知道流量是通过HTTPS的,因为流量是通过内部网络上的端口80发送到每个服务器的。这就是/system/core/Security.php的用途。

我最终覆盖了/** * Set Cross Site Request Forgery Protection Cookie * * @return object */ public function csrf_set_cookie() { $expire = time() + $this->_csrf_expire; $secure_cookie = (config_item('cookie_secure') === TRUE) ? 1 : 0; if ($secure_cookie && (empty($_SERVER['HTTPS']) OR strtolower($_SERVER['HTTPS']) === 'off')) { return FALSE; } setcookie($this->_csrf_cookie_name, $this->_csrf_hash, $expire, config_item('cookie_path'), config_item('cookie_domain'), $secure_cookie); log_message('debug', "CRSF cookie Set"); return $this; } 中的HTTP_X_FORWARDED_PROTO来解决此问题:

csrf_set_cookie()

答案 1 :(得分:0)

看起来这可能会解决问题,请确保您的代码中包含form_open()。根据codeigniter表单助手上的documentation

  

创建一个带有基本URL的开始表格标签...

这也应该在没有form_hidden()的情况下自动添加csrf。

答案 2 :(得分:0)

如果你想解决这个CODEIGNITER BUG,你可以设置如下:

$config['sess_cookie_name'] = 'ci_projectname_session';

...

...

$config['cookie_prefix']    = 'ci_projectname_';

如上所示,cookie前缀和cookie名称必须一样。