我设置了这样的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字符串?
答案 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组件内部和配置,所以再次这是推荐的任何内容!