Подтвердить что ты не робот

CodeIgniter 2.x set_cipher и set_flashdata не могут использоваться вместе

Когда я пытаюсь использовать set_cipher и set_flashdata вместе в CodeIgniter, 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, если она имеет правильное разрешение:

Уровень важности: Уведомление → 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

4b9b3361

Ответ 1

A1: Оба.

Это не ошибка сама по себе, но определенно плохой дизайн. Библиотека сеансов CI2 зависит от того же экземпляра CI_Encrypt, который равен $this->encrypt. Итак, когда библиотека сеансов уже использует его, и вы меняете шифр в середине этого процесса, вы действительно нарушаете его.

A2: Загрузите другой экземпляр библиотеки Encryption для вашего собственного использования.

Вот так:

// You can use $this->encrypter afterwards
$this->load->library('encrypt', NULL, 'encrypter');

Однако длина полученного шифротекста - действительно плохая причина для изменения алгоритма шифрования.