мы должны прочитать файлы cookie Cakephp 2 в Cakephp 3. Но, похоже, во время обновления тег CakeCookie
был удален из файлов cookie. Таким образом, каждый cookie Cakephp является отдельным. Что касается здесь, Cakephp 3 может читать старые файлы cookie, если они были написаны AES. Но в старой версии cakephp по умолчанию был шифр, и наши файлы cookie были написаны с помощью шифрования. Поэтому мы не можем читать старые файлы cookie.
Это возможность читать старые файлы cookie в Cakephp 2 и обновлять их с помощью AES. Но когда мы обновляемся до Cakephp 3, будут пользователи, у которых есть Cookies Cakephp 2. Поэтому нам нужно проверить это внутри Cakephp 3.
Мы планируем, что в cakephp 3 читаем старые файлы cookie с шифром и записываем их значения в новые файлы cookie. Мы использовали код из метода шифрования безопасности и создали следующий код.
Проблема в том, что этот код хорошо работает для строк, но он не работает на некоторых вложенных массивах. Проблема может быть плюсовой знак или любые другие проблемы с кодировкой. Иногда это работает, иногда это не так.
Я поделился нашим кодом, чтобы показать наш процесс. Вы можете предложить другой способ конвертировать старые файлы cookie.
if (isset($_COOKIE['CakeCookie'])) {
if (is_array($_COOKIE['CakeCookie'])) {
foreach ($_COOKIE['CakeCookie'] as $key => $value) {
$valueDecr=$this->decryptSaltedData($value);
$this->Cookie->configKey($key, ['expires' => '+60 days']);
$this->Cookie->write($key, $valueDecr);
$this->Cookie->delete("CakeCookie[$key]");
unset($_COOKIE['CakeCookie'][$key]);
setcookie("CakeCookie[$key]", "aaa", time()-3600, '/');
setcookie("CakeCookie[$key]", "aaa", time()-3600, '/', '.example.com');
}
}
}
public function decryptSaltedData($data) {
$data2 = substr($data, 8);
$text = base64_decode($data2);
$key = Security::salt();
$cipherSeed='45454545454545454545';
srand($cipherSeed);
$out = '';
$keyLength = strlen($key);
for ($i = 0, $textLength = strlen($text); $i < $textLength; $i++) {
$j = ord(substr($key, $i % $keyLength, 1));
while ($j--) {
rand(0, 255);
}
$mask = rand(0, 255);
$out .= chr(ord(substr($text, $i, 1)) ^ $mask);
}
srand();
$first = substr($out, 0, 1);
if ($first === '{' || $first === '[') {
$decoded = json_decode($out, true);
if($decoded !== null) $out = $decoded;
}
return $out;
}
Решение:
После дополнительных тестов мы выяснили, что проблема существует из расширения браузера, который изменяет файлы cookie. Таким образом, код выше хорошо работает для конвертирования файлов CakePHP 2.