Cakephp 3 конвертирует cakephp 2 cookies

мы должны прочитать файлы 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.