shady
Guest
Проблемы с mcrypt, при сериализации сессий БД
//Фу гоню!!! Это не самокритика
само как-то в юмор запостилось! в PHP+БД писал ведь
//ну вобщем, ниже вопрос... (модератор, если можно , перенесите пост пожалуйста... мда уж)
Приветствую!
Собственно, постораюсь подробно описать проблему... исходник прилогается
Есть скрипт, который реализует собственные обработчики записи/чтения и т.д. пользовательской сессии, в частности запись/чтение данных сессии в БД и шифрование (использую mcrypt).
Запись/Чтения из БД работает правильно (там собственно и ошибиться то как-бы негде
, однако, непонятное поведение в случае шифрования -
после 5-7 раза кодирования/декодирования данных сессии, перед декодированной строкой данных, оказывается какой-то мусор... причём, при проверки с отключённым кодированием, в базу пишется то что и должно писаться, когда же при чтении из БДи последующем декодировании проявляется эта бага (моя криворукость?
такое впечатление, что при mdecrypt_generic не корректно инициализируется буфер...
например (см. исходник), при print_r($_SESSION) видим нечто вроди
Array ( [uГW9е╖�;Вр░s�11-55-05, 27-04-06";r] => 0 [c] => 11-56-48, 27-04-06 [r] => 11-56-48, 27-04-06 )
т.е. декодируется нормально, но что эта за [uГW9е╖�;Вр░s в самом начале???
Вобщем, народ, кто что может подсказать - буду весьма и весьма рад!
***
php 6.0.0 (тестил также просто на 5.0, 5.1)
Mysql 5.1
Apache 1.3.33
OS: Win/NIX
Как устроено чтение/запись в вырезанном коде, думаю понятно, да и не важно это впринципе, так как все те части работают корректно...
//Фу гоню!!! Это не самокритика

//ну вобщем, ниже вопрос... (модератор, если можно , перенесите пост пожалуйста... мда уж)
Приветствую!
Собственно, постораюсь подробно описать проблему... исходник прилогается

Есть скрипт, который реализует собственные обработчики записи/чтения и т.д. пользовательской сессии, в частности запись/чтение данных сессии в БД и шифрование (использую mcrypt).
Запись/Чтения из БД работает правильно (там собственно и ошибиться то как-бы негде

после 5-7 раза кодирования/декодирования данных сессии, перед декодированной строкой данных, оказывается какой-то мусор... причём, при проверки с отключённым кодированием, в базу пишется то что и должно писаться, когда же при чтении из БДи последующем декодировании проявляется эта бага (моя криворукость?

такое впечатление, что при mdecrypt_generic не корректно инициализируется буфер...
например (см. исходник), при print_r($_SESSION) видим нечто вроди
Array ( [uГW9е╖�;Вр░s�11-55-05, 27-04-06";r] => 0 [c] => 11-56-48, 27-04-06 [r] => 11-56-48, 27-04-06 )
т.е. декодируется нормально, но что эта за [uГW9е╖�;Вр░s в самом начале???
Вобщем, народ, кто что может подсказать - буду весьма и весьма рад!
***
php 6.0.0 (тестил также просто на 5.0, 5.1)
Mysql 5.1
Apache 1.3.33
OS: Win/NIX
PHP:
class SessionEncrypt extends SessionPersistent {
protected $td = null;
protected $iv = null;
protected $ks = null;
protected $key = null;
//METHODS
public function __construct(&$entity) {
parent::__construct($entity);
$this->td= mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_CFB, '');
$this->iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($this->td), MCRYPT_RAND);
$this->ks = mcrypt_enc_get_key_size($this->td);
$this->key = substr(sha1(session_id()), 0, $this->ks);
}
public function __destruct() {
parent::__destruct();
session_write_close();
mcrypt_module_close($this->td);
}
public function open($save_path, $session_name) {
return $this->entity->open($save_path, $session_name);
}
public function close() {
return $this->entity->close();
}
public function read($id) {
$res = $this->entity->read($id); //данные из обрамляющего враппера
mcrypt_generic_init($this->td, $this->key, $this->iv);
$res = empty($res) ? $res : mdecrypt_generic($this->td, $res);
mcrypt_generic_deinit($this->td);
return $res;
}
public function write($id, &$session_data) {
mcrypt_generic_init($this->td, $this->key, $this->iv);
empty($session_data) ?
$this->entity->write($id, $session_data) :
$this->entity->write($id, mcrypt_generic($this->td, $session_data));
mcrypt_generic_deinit($this->td);
return true;
}
public function destroy($id) {
return $this->entity->destroy($id);
}
public function gc($life_time) {
return $this->entity->gc($life_time);
}
} //class SessionEncrypt
?>