PHP中的数组

Pau*_*ios 58 php arrays security cookies

如何在cookie中存储数组的正确方法?在PHP代码示例中:

$number_ticket=2;
$info[7][5]=1;
$info[8][5]=1;
Run Code Online (Sandbox Code Playgroud)

Mar*_*yan 104

要将数组值存储在cookie中,首先需要将它们转换为字符串,因此这里有一些选项.

将cookie存储为JSON

存储代码

setcookie('your_cookie_name', json_encode($info), time()+3600);
Run Code Online (Sandbox Code Playgroud)

阅读代码

$data = json_decode($_COOKIE['your_cookie_name'], true);
Run Code Online (Sandbox Code Playgroud)

如果您需要使用JavaScript在前端读取cookie,JSON也可以很好地选择.

实际上你可以使用任何encrypt_array_to_string/ decrypt_array_from_stringmethods组将数组转换为字符串并将字符串转换回相同的数组.例如,您也可以使用explode/ implode作为整数数组.

警告:不要使用序列化/反序列化

来自PHP.net

在此输入图像描述

Do not pass untrusted user input to unserialize(). - 任何通过HTTP包括cookie的东西都是不可信的!

与安全相关的参考

作为替代解决方案,您也可以在不将数组转换为字符串的情况下完成.

setcookie('my_array[0]', 'value1' , time()+3600);
setcookie('my_array[1]', 'value2' , time()+3600);
setcookie('my_array[2]', 'value3' , time()+3600);
Run Code Online (Sandbox Code Playgroud)

如果您打印$_COOKIE变量,您将看到以下内容

echo '<pre>';
print_r( $_COOKIE );
die();
Run Code Online (Sandbox Code Playgroud)
Array
(   
    [my_array] => Array
        (
            [0] => value1
            [1] => value2
            [2] => value3
        )

)

这是PHP功能的记录.

来自PHP.net

Cookies names can be set as array names and will be available to your PHP scripts as arrays but separate cookies are stored on the user's system.

  • 这应该是正确的答案.感谢您考虑安全性和参考.+1 (3认同)
  • 很好的答案,谢谢。我发现你需要在 `json_decode()` 之前`stripslashes()` cookie 值。 (2认同)
  • @hobailey很棒的评论!我已经工作了几个小时,为什么我的代码不能在JSON编码的cookie上工作,而在PHP变量上却可以工作!原因是您确实需要在json_decode()之前添加stripslashes()。在PHP数组中获取json编码的cookie的示例代码:json_decode(stripslashes($ _ COOKIE ['mycookie']),true); (2认同)

Nar*_*adu 71

序列化数据:

setcookie('cookie', serialize($info), time()+3600);
Run Code Online (Sandbox Code Playgroud)

然后反序列化数据:

$data = unserialize($_COOKIE['cookie'], ["allowed_classes" => false]);
Run Code Online (Sandbox Code Playgroud)

在数据之后,$ info和$ data将具有相同的内容.

  • 建议不要使用序列化,因为可能存在安全漏洞.(http://php.net/manual/en/function.setcookie.php - >备注) (28认同)
  • 实际上,请不要对用户提交的数据使用`unserialize`.使用PHP的__wakeup和__destruct方法进行对象注入很容易被利用.您可以使用`json_encode/json_decode`而不是`serialize/unserialize`.https://www.owasp.org/index.php/PHP_Object_Injection (25认同)

Nat*_*han 15

在cookie上使用序列化和反序列化是一种安全风险.用户(或攻击者)可以更改cookie数据,然后当您反序列化它时,它可以在您的服务器上运行PHP代码.Cookie数据不应该被信任.请改用JSON!

来自PHPs网站......

不要将不受信任的用户输入传递给unserialize().由于对象实例化和自动加载,反序列化可能导致代码被加载和执行,恶意用户可能能够利用它.如果需要将序列化数据传递给用户,请使用安全的标准数据交换格式,如JSON(通过json_decode()和json_encode()).


Rob*_*gar 7

Cookie基本上是文本,因此您可以通过将其编码为JSON字符串来存储数组(请参阅参考资料json_encode).请注意,您可以存储的字符串长度有限制.


Dun*_*zzz 7

试试serialize().它将数组转换为字符串格式,然后您可以使用unserialize()它将其转换回数组.像WordPress这样的脚本使用它来将多个值保存到单个数据库字段中.

你也可以json_encode()像Rob说的那样使用,如果你想在javascript中读取cookie,这可能很有用.