PHP中的数组
如何在cookie中正确地存储数组?在PHP中 代码示例:PHP中的数组,php,arrays,security,cookies,Php,Arrays,Security,Cookies,如何在cookie中正确地存储数组?在PHP中 代码示例: $number_ticket=2; $info[7][5]=1; $info[8][5]=1; Cookie基本上是文本,因此您可以通过将数组编码为JSON字符串来存储它(请参见JSON\u encode)。请注意,您可以存储的字符串长度是有限制的 试试看。它将数组转换为字符串格式,然后可以使用将其转换回数组。像WordPress这样的脚本使用它将多个值保存到单个数据库字段中 正如Rob所说,您还可以使用json\u encode()
$number_ticket=2;
$info[7][5]=1;
$info[8][5]=1;
Cookie基本上是文本,因此您可以通过将数组编码为JSON字符串来存储它(请参见
JSON\u encode
)。请注意,您可以存储的字符串长度是有限制的 试试看。它将数组转换为字符串格式,然后可以使用将其转换回数组。像WordPress这样的脚本使用它将多个值保存到单个数据库字段中
正如Rob所说,您还可以使用json\u encode()
,如果您想在javascript中读取cookie,这可能很有用。序列化数据:
setcookie('cookie', serialize($info), time()+3600);
$data = unserialize($_COOKIE['cookie'], ["allowed_classes" => false]);
然后取消序列化数据:
setcookie('cookie', serialize($info), time()+3600);
$data = unserialize($_COOKIE['cookie'], ["allowed_classes" => false]);
数据之后,$info和$data将具有相同的内容。您也可以尝试在不同的cookie中写入不同的元素。Cookie名称可以设置为数组名称,并且可以作为数组提供给PHP脚本,但是单独的Cookie存储在用户系统中。考虑使用CuffDE()设置一个具有多个名称和值的Cookie。不建议为此目的使用serialize(),因为它可能导致安全漏洞。查看PHP函数了解更多详细信息在Cookie上使用序列化和非序列化是一种安全风险。用户(或攻击者)可以更改cookie数据,然后当您取消序列化它时,它可以在您的服务器上运行PHP代码。不应信任Cookie数据。改用JSON 发件人: 不要将不受信任的用户输入传递到
unserialize()
,无论允许的类的选项值如何。由于对象实例化和自动加载,非序列化可能导致加载和执行代码,恶意用户可能会利用此漏洞进行攻击。如果需要将序列化数据传递给用户,请使用安全的标准数据交换格式,如JSON(通过JSON\u decode()
和JSON\u encode()
)
要在cookie中存储数组值,首先需要将它们转换为字符串,因此这里有一些选项
将cookie存储为JSON
存储代码
setcookie('your_cookie_name', json_encode($info), time()+3600);
读取代码
$data = json_decode($_COOKIE['your_cookie_name'], true);
如果您需要使用JavaScript在前端读取cookie,那么JSON也是一个不错的选择
实际上,您可以使用将数组转换为字符串并将字符串转换回同一数组的任何encrypt\u array\u to\u string
/decrypt\u array\u from\u string
方法组。
例如,您还可以对整数数组使用分解
/内爆
警告:不要使用序列化/取消序列化
来自PHP.net
不要将不受信任的用户输入传递到unserialize()。
-任何来自HTTP(包括cookie)的内容都是不受信任的
与安全相关的参考资料
作为替代解决方案,您也可以在不将数组转换为字符串的情况下执行此操作。
如果打印$\u COOKIE
变量,您将看到以下内容
echo '<pre>';
print_r( $_COOKIE );
die();
echo';
打印($\u COOKIE);
模具();
排列
(
[我的数组]=>数组
(
[0]=>值1
[1] =>值2
[2] =>值3
)
)
这是PHP特性的文档
来自PHP.net
Cookies名称可以设置为数组名称,并且可以作为数组用于您的PHP脚本,但是单独的Cookies存储在用户的系统中。
最近我为我的客户端创建了此代码,我在这段代码中使用了array for cookie,实际上此代码最近会被用户使用Cookies查看页面,希望它能帮助您
// set the cookies
setcookie("product[cookiethree]", "cookiethree");
setcookie("product[cookietwo]", "cookietwo");
setcookie("product[cookieone]", "cookieone");
// after the page reloads, print them out
if (isset($_COOKIE['product'])) {
foreach ($_COOKIE['product'] as $name => $value) {
$name = htmlspecialchars($name);
$value = htmlspecialchars($value);
echo "$name : $value <br />\n";
}
}
函数curPageURL(){//get url
返回“http”((
!空($\u服务器['HTTPS'])&&
$\u服务器['HTTPS']!=='off'||
$\u服务器['SERVER\u PORT']==443
)?'s':''):/。$\u服务器['SERVER\u NAME'](
$\u服务器['SERVER\u PORT']==80?'':$\u服务器['SERVER\u PORT']
).u服务器['REQUEST_URI'];
}
$currentPage=curPageURL();//调用函数
$counter=$\u COOKIE[''u counter'];//设置计数器变量
如果(!$\u COOKIE[''u PAGES']){//if\u PAGES COOKIE
$default=1;//将默认值设置为1
setcookie(“_counter”,$default,time()+7200);//设置计数器cookie
setcookie(“_PAGES[$default]”,$currentPage,time()+3600);//设置cookie
}
else{//if!\u
$default=$counter+1;//将默认值设置为+1
setcookie(“_counter”,$default,time()+7200);//设置计数器cookie
}
if(@in_数组($currentPage,@$_COOKIE['''u PAGES']){//如果找到相同的url
}
else{//如果找到新的url
setcookie(“_PAGES[$default]”,$currentPage,time()+3600);//设置cookie
}
如果($_COOKIE[''页面]){
foreach($作为$value的COOKIE[''页面]){
回声“;
}
}
刚刚找到需要的东西。现在,我可以将访问过的产品存储在cookies上,并在它们返回站点时显示出来
//设置cookies
setcookie(“产品[cookiethree],“cookiethree”);
setcookie(“产品[cookietwo],“cookietwo”);
setcookie(“产品[cookieone],“cookieone”);
//重新加载页面后,将其打印出来
如果(isset($_COOKIE['product'])){
foreach($\u COOKIE['product']作为$name=>$value){
$name=htmlspecialchars($name);
$value=htmlspecialchars($value);
echo“$name:$value
\n”;
}
}
不建议使用serialize,因为可能存在安全漏洞。(->注意事项)事实上,请不要对用户提交的数据使用取消序列化
。通过使用PHP的_wakeup和_destruct方法进行对象注入,可以很容易地利用此漏洞。您可以使用json\u encode/json\u decode
而不是serialize/unserialize
。对我来说不起作用,我尝试了对文件的post请求,并尝试将输出的数组作为响应返回,但没有返回任何结果。这可能是正确的答案。感谢您考虑安全问题并提供参考+回答得好,谢谢。我发现您需要在json\u decode()
之前stripslashes()
cookie值。@hobailey好极了!我已经工作了好几个小时了,为什么我的代码不能与json编码的cookies一起工作
// set the cookies
setcookie("product[cookiethree]", "cookiethree");
setcookie("product[cookietwo]", "cookietwo");
setcookie("product[cookieone]", "cookieone");
// after the page reloads, print them out
if (isset($_COOKIE['product'])) {
foreach ($_COOKIE['product'] as $name => $value) {
$name = htmlspecialchars($name);
$value = htmlspecialchars($value);
echo "$name : $value <br />\n";
}
}