php中magic_quotes_gpc对unserialize的影响分析
《php中magic_quotes_gpc对unserialize的影响分析》要点: PHP教程本文实例分析了php中magic_quotes_gpc对unserialize的影响.分享给大家供大家参考.具体如下: PHP教程magic_quotes_gpc是一个php中一个给单双引号增加一些平安过滤的函数,但此函数对于我们使用unserialize函数时会产生一些影响,下面我们就这个问题与大家看几个实例与解决办法. PHP教程昨天朋友让我帮他办理下他网站的购物车程序的问题,程序用的是PHPCMS,换空间前是好的,刚换的空间,具体问题是提示成功加入购物车后跳转到购物车页面,购物车里为空. PHP教程我看了下代码,大致的原理就是将产品ID与数量存放到数组中,然后序列化后存入COOKIE中,在购物车页面反序列化COOKIE,得到这个数组并读出对应产品信息. PHP教程调试一下发现问题出现在unserialize上,我先根据它的购物车原理写了段代码,代码如下:
代码如下:
<?php???
??? header("Content-type: text/html; charset=utf-8");??? ??? $magic = get_magic_quotes_gpc() ? "开启" : "未开启";??? ?????? ??? $str = array(array('goods_id'=>13,'number'=>1));??? ??? setcookie("cart",serialize($str));??? ??? echo "magic_quotes_gpc: ".$magic."<br>";??? ??? echo $_COOKIE['cart']."<br>";??? ??? print_r(unserialize($_COOKIE['cart']));??? ?> 大家执行下这段代码可以发现,当你的magic_quotes_gpc关闭时这段程序执行没有任何问题,但是magic_quotes_gpc开启时你会发现反序列化并不成功,这时你可能就知道问题出在哪了? PHP教程原因是magic_quotes_gpc开启时,系统会自动对POST GET COOKIE的结果中的单引号进行转义,加上,所以$_COOKIE['cart']的值就变成了a:1:{i:0;a:2:{s:8:"goods_id";i:13;s:6:"number";i:1;}},这样的话unserialize是无法反序列化成功的,就出现了问题. PHP教程解决的方法简单来说就是将unserialize($_COOKIE['cart'])改成unserialize(stripslashes($_COOKIE['cart'])),在COOKIE前加上stripslashes,去掉转义符,这样就没问题了. PHP教程对于cookie影响我们再做个测试: PHP教程1.问题:项目数据需要序列化保存在cookie中,然后再获得cookie的数据反序列,获得原数据,代码如下:
代码如下:
$a[0] = array("key"=>"哈? 逻");??
$a[1] = array("key"=>"哈 逻");?? $jsona = json_encode($a);?? setcookie("testcookie",""); setcookie("testcookie",$jsona);?? var_dump($jsona,true); //正常取值?? var_dump(json_decode($_COOKIE['testcookie'],true)); //取不到值 在没有经过cookie赋值时,正常反序列化,经过cookie之后,取到值为空. PHP教程2.分析,代码如下:
代码如下:
$a[0] = array("key"=>"哈? 逻");??
$a[1] = array("key"=>"哈 逻");?? $jsona = json_encode($a);?? var_dump($jsona); //string(50) "[{"key":"u54c8 u903b"},{"key":"u54c8 u903b"}]"?? setcookie("testcookie","");?? setcookie("testcookie",$jsona);?? var_dump($_COOKIE['testcookie']); // string(62) "[{"key":"u54c8 u903b"},{"key":"u54c8 u903b"}]"?? var_dump(json_decode($_COOKIE['testcookie'],true)); 对比了一下数据,经过cookie处理后多了几个//,解决办法,代码如下:
代码如下:
var_dump(json_decode(stripslashes($_COOKIE['testcookie']),true));??
var_dump(json_decode(str_replace("","",$_COOKIE['testcookie']),true)); 3.总结:magic_quotes_gpc在开启的情况下,会影响通过get|post|cookies获得的数据.所以我们在get|post|cookies处理数据的时候,首先判断magic_quotes_gpc开启情况. PHP教程① 在开启情况下,处理数据需要stripslashes PHP教程② 在没有开启情况下,接受数据先addslashes,处理数据stripslashes PHP教程希望本文所述对大家的PHP程序设计有所赞助. 编程之家培训学院每天发布《php中magic_quotes_gpc对unserialize的影响分析》等实战技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培养人才。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |