【问题标题】:PHP how to stringify array and store in cookie [duplicate]PHP如何将数组字符串化并存储在cookie中[重复]
【发布时间】:2021-12-30 04:09:37
【问题描述】:

我有一个这样的数组

$value = {array('id'=>$id, 'email'=>$email, 'token'=>$token)}

我想对数组进行字符串化然后编码然后将其存储在cookie“登录”中。你是怎样做的 ?另外请告诉我如何解码和读取存储的值。

编辑:

我一直在尝试序列化/反序列化,但没有按预期工作。例如,

$value = serialize(array('id'=>33, 'email'=>'big@gmail.com', 'token'=>'e9aa0966773d68e0fbf9cb21fc2877b4'));

echo $value; //a:3:{s:2:"id";i:33;s:5:"email";s:20:"big@gmail.com";s:5:"token";s:32:"e9aa0966773d68e0fbf9cb21fc2877b4";}

但是当值转到cookie时,它看起来像这样

a%3A3%3A%7Bs%3A2%3A%22id%22%3Bs%3A1%3A%226%22%3Bs%3A5%3A%22email%22%3Bs%3A20%3A%22craigcosmo%40gmail.com%22%3Bs%3A5%3A%22token%22%3Bs%3A32%3A%22e9aa0966773d68e0fbf9cb21fc2877b4%22%3B%7D

【问题讨论】:

  • cookie 永远不会是纯文本。原因在于它是如何存储在 HTTP 标头中的。 Cookie: 标头使用冒号和分号等字符作为分隔符,因此需要将它们转义(PHP 基本上采用 cookie 的值并在将其输出到客户端之前对其执行 url_encode
  • 所以要读取cookie值我必须先进行url_decode?​​span>
  • php url_decode 在构建 $_COOKIE 超全局时应该自动发生。

标签: php


【解决方案1】:

json_encode/json_decode

$_COOKIE['login'] = json_encode($array);
$array = json_decode($_COOKIE['login']);

也可以使用serialize/unserialize:

$_COOKIE['login'] = serialize($array);
$array = unserialize($_COOKIE['login']);

也许吧。


更新

使用此代码:

<html><body><pre><?php
  $array = Array(
    'id'  => 1234,
    'email' => 'example@example.com',
    'token' => base64_encode('abcDEF1234')
  );
  
  echo "Var Dump (initial):\r\n";
  var_dump($array);
  
  $serialized = serialize($array);
  echo "Serialized:\r\n".$serialized."\r\n";
  
  $unserialized = unserialize($serialized);
  echo "Unserialized:\r\n".$unserailized."\r\n";
  var_dump($unserialized);
?></pre></body></html>

您将生成以下内容:

Var Dump (initial):
array(3) {
  ["id"]=>
  int(1234)
  ["email"]=>
  string(19) "example@example.com"
  ["token"]=>
  string(16) "YWJjREVGMTIzNA=="
}
Serialized:
a:3:{s:2:"id";i:1234;s:5:"email";s:19:"example@example.com";s:5:"token";s:16:"YWJjREVGMTIzNA==";}
Unserialized:

array(3) {
  ["id"]=>
  int(1234)
  ["email"]=>
  string(19) "example@example.com"
  ["token"]=>
  string(16) "YWJjREVGMTIzNA=="
}

EDIT2

您看到的是基于 HTTP 协议传输 cookie 的编码值。 cookie 传输中有两个标头:Set-CookieCookie。一个是服务器->客户端,另一个是客户端->服务器,尊敬的。

当 PHP 设置 cookie(例如使用 setcookie)时,PHP 实际上只是简化了以下操作:

setcookie('login',$serialized);

在 PHP 中翻译为:

header('Set-Cookie: login='.urlencode($serialized).'; '
      .'expires=Wed, 12-Jan-2011 13:15:00 GMT; '
      .'path=/; domain=.mydomain.com');

如果您有 : 或 SPACE 之类的字符,浏览器将不知道 cookie 的属性在哪里开始和结束。

【讨论】:

  • 啊...很少使用的 Jason 编码。 :-)
  • 您的意思是“Jason_encode”吗?还是“json_encode”的错字?
  • $array 实际上是一个 STD_OBJECT 除非你指定你想要一个带有可选第二个参数的数组。
  • @middaparka:正在使用手机,哎呀。当我在等待 Outlook 进行部署时的初始化时,我感到很无聊。 ;p 另外,我认为我会提供不同的 json_de/encode。 SO 的美妙之处之一,有这么多的解决方案。
  • @MarcB: $array 只是用户尝试存储/检索的数组的象征。
【解决方案2】:

永远不要使用带有用户输入的序列化! serialize calls __wakeup 是一个很大的安全漏洞,因为您可以在服务器上执行代码。 (现在是你打破它们之前的规则)

有一个serialize/unserialize 函数可以将数组转换为字符串并返回。

编辑: 当您将字符串存储到 cookie (setcookie) 时,php 需要对字符串进行 url 编码。这可以防止保存到 cookie 的字符串中的任何字符干扰任何其他标题。下次加载页面时,php 获取 cookie 并自动对 cookie 值进行 url 解码,以将其返回到之前的值。至于 cookie 中存储的内容,这在 php 中应该无关紧要,因为 php 会自动执行 url 编码/解码。现在,如果您使用另一种语言(例如 javascript)获取 cookie,那么是的,您将获取原始字符串。在这种情况下,您可以在 JS 中使用 decodeURI 之类的东西来取回原始值。

【讨论】:

  • 您是否尝试对字符串进行base64_encode?不应该是必需的,但如果您遇到问题,它可能不会造成伤害,并且可能有助于防止出现未正确自动编码的字符的问题。
  • -1 序列化将调用序列化类的构造函数。这很糟糕,因为它会导致代码执行。不要在不受信任的数据上使用。
  • @rambocoder 那么json_encode/json_decode 更安全吗?这就是我在用户输入中一直使用的。
  • @FabrícioMatté 是的,json_encode/decode 更安全。使用序列化/反序列化可以执行代码(反序列化调用一个 __wakeup 魔术方法,如果它存在于一个类中)。您永远不应该执行任何用户提交的代码,因为您永远无法真正 100% 地验证它不是恶意的。 json_encode/json_decode 不调用此类方法,因此在处理用户提交的数据时更安全。不同之处在于 json 的长度更小,但是您会丢失一些数据类型。反序列化将返回特定类的实例,方法和所有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 2011-11-16
  • 1970-01-01
  • 2016-10-16
  • 2013-05-02
相关资源
最近更新 更多