CodeIgniter 2.x set_cipher和set_flashdata不能一起使用

时间:2015-05-09 18:30:45

标签: php codeigniter

当我尝试在CodeIgniter中一起使用set_cipherset_flashdata时,未设置flashdata并记录php错误。

要在 新鲜 CI中重现这一点:

更改以下config.php行(默认CI配置更改):

$config['sess_encrypt_cookie'] = TRUE;
$config['log_threshold'] = 1; // To log the error 
// Encryption key should be set, just set anything, for example:
$config['encryption_key'] = 'HjyePR4FPF70vHKaHTl8jZ0hSMgOu5bW';

控制器(尽可能简化):

<?php

class Welcome extends CI_Controller {

 function __construct(){parent::__construct();}

 function index()
 {
 $this->load->library('session');
 $this->load->library('encrypt');

 $this->encrypt->set_cipher(MCRYPT_BLOWFISH);
 $this->encrypt->encode('message');

 $this->session->set_flashdata('item', 'value');
 }

}

然后只需在浏览器和刷新页面中打开控制器,您将看到未设置flashdata,如果CI应用程序日志文件夹具有正确的权限,则会记录以下错误:

  

严重性:通知 - &gt; unserialize():错误0偏移量为286字节/Applications/MAMP/htdocs/final/system/libraries/Session.php 741

1。这是CodeIgniter的错误还是我做错了什么?

2。我该怎么做才能发挥作用?

P.S. had to change cipher because default encryption result was too long for a message I needed to encrypt, but I wanted to use default method for anything else CI uses

1 个答案:

答案 0 :(得分:12)

A1:两者。

这本身并不是一个bug,但绝对是糟糕的设计。 CI2会话库确实依赖于CI_Encrypt的{​​{1}}实例。因此,当会话库已经在使用它并且您在该过程的中间更改密码时,确实是您要破解它。

A2:加载另一个加密库实例供您自己使用。

像这样:

$this->encrypt

但是,生成的密文长度是改变加密算法的一个非常糟糕的原因。