当我尝试在CodeIgniter中一起使用set_cipher和set_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应用程序日志文件夹具有正确的权限,则会记录以下错误:
Severity: Notice –> unserialize(): Error at offset 0 of 286 bytes /Applications/MAMP/htdocs/final/system/libraries/Session.PHP 741
这是一个CodeIgniter bug还是我做错了?
我应该怎么做这个工作?
附:不得不改变密码,因为我需要加密的消息的默认加密结果太长,但是我想使用默认方法来进行任何其他CI使用
A1:两者.
这本身不是一个bug,但绝对糟糕的设计. CI2会话库确实依赖于$this->加密的相同CI_Encrypt实例.所以当会话库已经在使用它的时候,你在这个过程的中间改变了密码,那确实是你打破它的.
A2:加载加密库的另一个实例以供您自己使用.
喜欢这个:
// You can use $this->encrypter afterwards $this->load->library('encrypt',NULL,'encrypter');
然而,生成的密文的长度是改变加密算法的一个非常糟糕的原因.