【问题标题】:CakePHP reading encrypted cookie valuesCakePHP 读取加密的 cookie 值
【发布时间】:2013-11-30 13:39:35
【问题描述】:

我这样设置 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 字符串?

【问题讨论】:

  • 我不明白你的意思,为什么你认为使用 cookie 组件不安全?
  • Cookie 组件并非不安全。我发现在不加密的情况下将 cookie 内容写入数据库是不安全的。所以我将加密的字符串保存到数据库中。

标签: php cakephp cookies encryption


【解决方案1】:

我没有看到不使用 CookieComponent 的理由,供您参考,该组件确实会加密您编写的任何内容。这是文档的摘录

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

【讨论】:

  • 我默认使用cookie组件加密。问题是在没有 this->cookie->read() 的情况下读取 cookie
  • 你为什么要在没有 CookieComponent::read() 的情况下读取 cookie?
  • 正如我在问题中提到的,我将加密的 cookie 写入 DB。当我需要该数据时,我无法使用 CookieComponent::read() 读取它
【解决方案2】:

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

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

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

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

假设只使用 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 组件的内部结构和配置,因此,这绝不是推荐的!

【讨论】:

  • 我更喜欢默认的 CakePHP 行为。因为这会增加我的复杂性。解密 cookie 的最小代码是多少?似乎 Cookiecomponent 首先 base64_decodes 并使用密码方法? api.cakephp.org/2.4/source-class-CookieComponent.html#480-512
  • 有时以正确的方式做这件事需要更多的复杂性,尽管我想说它实际上会不那么复杂(即使它需要更多的代码),因为它不需要必要的 hocus pocus处理 cookie 数据格式。无论如何,请检查我的更新答案。
  • 感谢代码 sn-p 和 rijndael 的推荐。他们俩都像一个魅力。
猜你喜欢
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 2018-11-13
  • 2015-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多