Cakephp 3转换cakephp 2 cookies

时间:2015-07-20 21:17:30

标签: php cakephp cookies cakephp-3.0

我们需要在Cakephp 3中阅读Cakephp 2用户cookie。但似乎在更新期间,CakeCookie标签已从cookie中删除。所以每个Cakephp cookie都是分开的。关于here,Cakephp 3可以读取旧的cookie,如果它们是用AES编写的。但在旧的cakephp中,默认选项是密码,我们的cookie是用密码编写的。所以我们现在无法阅读旧的cookies。

可以选择在Cakephp 2中读取旧的Cookie并使用AES更新它们。但是当我们更新到Cakephp 3时,会有用户拥有Cakephp 2 cookie。所以我们需要在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 cookie。

0 个答案:

没有答案