CakePHP读取加密的cookie值

时间:2013-11-17 11:46:37

标签: php cakephp cookies encryption

我设置了这样的cookie:

$this->Cookie->write('mycookie', $data, TRUE, '30 days');

我这样看了他们:

$cookieData = $this->Cookie->read('mycookie');

但出于安全方面的考虑,我会阅读一些像这样的cookie:

$cookieRaw= $_COOKIE['CakeCookie']['mycookie'];

我将这个原始cookie写入我的数据库。然后我需要阅读cookie的内容。

但是你知道原始cookie类似于" Q2FrZQ = dsdsaDASDasdasdsa"。
所以我需要阅读cookie的内容。

好像CookieComponent:read()使用受保护的CookieComponent:_decrypt功能。我不想复制粘贴_decrypt()内容。有没有更简单的方法来读取解密的CakePHP字符串?

2 个答案:

答案 0 :(得分:2)

我没有看到不使用CookieComponent的原因,为了您的信息,此组件会加密您编写的任何内容。以下是文档的摘录

  

默认情况下,cookie中的所有值都已加密。如果要将值存储为纯文本,请将write()方法的第三个参数设置为false。对cookie值执行的加密是相当简单的加密系统。它使用Security.salt和预定义的Configure类var Security.cipherSeed来加密值。为了使您的cookie更安全,您应该更改app / Config / core.php中的Security.cipherSeed以确保更好的加密。:

答案 1 :(得分:1)

如果您需要存储加密的数据,那么我建议您自己加密,而不是依赖cookie组件内部。

即,使用cookie组件读取cookie数据,以便最终获得解密数据,然后使用您最喜欢的加密算法对其进行加密(我建议使用Security::rijndael())并将其存储在数据库中这样你就可以对数据进行适当的控制。

另一种选择是创建一个自定义组件,扩展cookie组件并使解密功能公开。但是我真的不认为这是一个好主意,数据库中的数据不应该是组件关注点,这在模型层中更适合。

如果您坚持使用mundged cookie数据并手动解密,那么您必须执行与CookieComponent代码中相同的操作。首先从数据中剥离Q2FrZQ==.,然后base64对其进行解码,然后根据cookie组件使用的方法对其进行解密(默认情况下为Security::cipher(),不推荐使用btw),最后JSON解码必要的,如CookieComponent::_explode()

假设只使用了Cake 2.x样式的cookie数据,并且数据应该始终加密,那么它可以分解为此(可能需要调整解密方法,具体取决于cookie组件配置):

$data = substr($data, 8);
$data = base64_decode($data);
$data = Security::cipher($data, Configure::read('Security.salt'));

$first = substr($data, 0, 1);
if ($first === '{' || $first === '[') {
    $decoded = json_decode($data, true);
    if($decoded !== null) $data = $decoded;
}

然而,这很大程度上依赖于cookie组件内部和配置,所以再次这是推荐的任何内容!