Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的数组_Php_Arrays_Security_Cookies - Fatal编程技术网

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()

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

$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";
    }
}