2013-03-21 86 views
0

感谢您查看我的问题。反序列化cookie变量

的代码:

$array = array("zero","one","true","three"); 
echo $beforecookie = serialize($array); //<<-- IT WORKS; 
print_r(unserialize($beforecookie)); //<<--IT WORKS 

setcookie('mycookie', $beforecookie, time()+3600); 
echo $aftercookie = $_COOKIE['mycookie']; // <<-- it works perfectly same with $beforecookie 

$data = unserialize($aftercookie); 
print_r($data); //<<--RETURN NOTHING (the problem) 
var_dump($data); //<<-- RETURN bool(false); 

的串(从阵列串行化),我从饼干有不能被解序列化;为什么?使用serialize()将它设置为cookie后,如何返回数组?或者我错过了什么?

感谢您的帮助。

+3

** ** NEVER饼干解序列化数据(或者可以由用户操纵任何其他字符串)!这是一个重大的安全漏洞。 – ThiefMaster 2013-03-21 13:22:08

+0

您是否有任何反序列化错误?检查日志 – sectus 2013-03-21 13:24:56

+0

@ThiefMaster,但它有可能吗? – egig 2013-03-21 13:26:05

回答

0

在脚本执行后设置Cookie以及标题,因此在页面重新加载之前您无法访问它。

0

你可以改变你的代码只有这部分:

if(!$_COOKIE['mycookie']){ 
setcookie('mycookie', $beforecookie, time()+3600); 
} 

然后重新加载页面...

1

这段代码:

setcookie('mycookie', $beforecookie, time()+3600); 
echo $aftercookie = $_COOKIE['mycookie'] // <<-- it works perfectly same with $beforecookie 

您设置赢得了饼干直到浏览器刷新页面才能使用代码。另外,如果您确实想要这样做,请确保向基于服务器端机密的cookie添加校验和,并保存到cookie中的数据内容。看看hash_hmac()。盲目地对从不受信任的来源收到的价值进行串行化简直是不负责任的。

0

如果你想拥有你的cookie可以立即(而不是之后的其他类似页面刷新说)只是增加

$_COOKIE['mycookie'] = $beforecookie; 

这条线之后

setcookie('mycookie', $beforecookie, time()+3600); 

您的cookie将立即提供:-)

1

需要使用base64_encode()后功能serialize()

集:

setcookie('name', base64_encode(serialize($arr))); 

得到:

unserialize(base64_decode($_COOKIE['name']));