在cookies数组PHP
如何正确的方法来存储数组在cookie中? 在PHP代码示例中:
$number_ticket=2; $info[7][5]=1; $info[8][5]=1;
序列化数据:
setcookie('cookie', serialize($info), time()+3600);
然后反序列化数据:
$data = unserialize($_COOKIE['cookie']);
数据之后,$ info和$ data将具有相同的内容。
要将数组值存储在cookie中,首先需要将它们转换为string,所以这里有一些选项。
将Cookie存储为JSON
存储代码
setcookie('your_cookie_name', json_encode($info), time()+3600);
阅读代码
$data = json_decode($_COOKIE['your_cookie_name'], true);
如果你需要在JavaScript前端读取cookie,JSON可以很好的select。
实际上,您可以使用任何encrypt_array_to_string
/ decrypt_array_from_string
方法组将数组转换为string并将string转换回相同的数组。 例如,你也可以使用explode
/ implode
作为整数数组。
警告:不要使用序列化/反序列化
从PHP.net
Do not pass untrusted user input to unserialize().
– 任何HTTP来的包括cookies都是不可信的!
有关安全性的参考
- http://php.net/manual/en/function.unserialize.php#refsect1-function.unserialize-notes
- https://www.owasp.org/index.php/PHP_Object_Injection
- 2010/11/rips_ccs.pdf
- https://www.notsosecure.com/remote-code-execution-via-php-unserialize/
- https://www.alertlogic.com/blog/writing-exploits-for-exotic-bug-classes-unserialize()/
- https://hakre.wordpress.com/2013/02/10/php-autoload-invalid-classname-injection/
- https://security.stackexchange.com/questions/77549/is-php-unserialize-exploitable-without-any-interesting-methods
作为替代解决scheme,您也可以在不将数组转换为string的情况
setcookie('my_array[0]', 'value1' , time()+3600); setcookie('my_array[1]', 'value2' , time()+3600); setcookie('my_array[2]', 'value3' , time()+3600);
如果您打印$_COOKIE
variables,您将看到以下内容
echo '<pre>'; print_r( $_COOKIE ); die();
排列 ( [my_array] =>数组 ( [0] => value1 [1] => value2 [2] => value3 ) )
这是logging的PHPfunction。
从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.
对cookie使用序列化和反序列化是一种安全风险。 用户(或攻击者)可以更改cookie数据,然后当您反序列化时,它可以在您的服务器上运行PHP代码。 Cookie数据不应该被信任。 改用JSON!
从PHP网站…
不要将不可信的用户input传递给反序列化()。 反序列化可能导致代码由于对象实例化和自动加载而被加载和执行,并且恶意用户可能能够利用这个。 如果您需要将序列化数据传递给用户,请使用安全的标准数据交换格式,例如JSON(通过json_decode()和json_encode())。
Cookies基本上是文本,所以你可以通过编码来存储一个数组作为JSONstring(参见json_encode
)。 请注意,您可以存储的string的长度是有限制的。
尝试serialize()
。 它将数组转换为string格式,然后可以使用unserialize()
将其转换回数组。 WordPress这样的脚本使用它来将多个值保存到单个数据库字段中。
你也可以像Rob说的那样使用json_encode()
,如果你想在javascript中读取cookie,这可能是有用的。
您也可以尝试在不同的Cookie中编写不同的元素。 Cookie名称可以设置为数组名称,并可作为数组用于您的PHP脚本,但单独的Cookie存储在用户的系统中。 考虑使用explode()来设置一个具有多个名称和值的cookie。 不build议为此使用serialize(),因为它可能导致安全漏洞。 看看setcookie PHP函数的更多细节
最近我为我的客户创build了这个代码,我在这个代码中使用数组作为cookie,实际上这个代码最近被用户使用cookies查看网页,希望它可以帮助你…!
function curPageURL() { // get url return 'http' . (( !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443 ) ? 's' : '') . '://' . $_SERVER['SERVER_NAME'] . ( $_SERVER['SERVER_PORT'] == 80 ? '' : $_SERVER['SERVER_PORT'] ) . $_SERVER['REQUEST_URI']; } $currentPage = curPageURL(); // call function $counter = $_COOKIE['_counter']; // set counter variable if(!$_COOKIE['_PAGES']){ // if _Pages cookie $default = 1; // set default value to 1 setcookie("_counter",$default,time()+7200); // set counter cookie setcookie("_PAGES[$default]",$currentPage, time()+3600); // set cookie } else{ // if ! _Pages cookie $default = $counter+1; // set default value to +1 setcookie("_counter",$default,time()+7200); // set counter cookie } if(@in_array($currentPage, @$_COOKIE['_PAGES'])){ // if same url found } else{ // if new url found setcookie("_PAGES[$default]",$currentPage, time()+3600); // set cookie } if($_COOKIE['_PAGES']){ foreach ($_COOKIE['_PAGES'] as $value){ echo "<a href='{$value}'>{$value}</a>"; } }