登录  /  注册
首页 > php教程 > php手册 > 正文

php中magic_quotes_gpc对unserialize的影响

php中文网
发布: 2016-05-27 08:47:34
原创
794人浏览过

magic_quotes_gpc是一个php中一个给单双引号增加一些安全过滤的函数,但此函数对于我使用unserialize函数时会产生一些影响,下面我就就这个问题与大家看几个实例与解决办法.

昨天朋友让我帮他解决下他网站的购物车程序的问题,程序用的是PHPCMS,换空间前是好的,刚换的空间,具体问题是提示成功加入购物车后跳转到购物车页面,购物车里为空.

我看了下代码,大致的原理就是将产品ID与数量存放到数组中,然后序列化后存入COOKIE中,在购物车页面反序列化COOKIE,得到这个数组并读出对应产品信息.

调试一下发现问题出现在unserialize上,我先根据它的购物车原理写了段代码,代码如下:

<?php    
header("Content-type: text/html; charset=utf-8");    
$magic = get_magic_quotes_gpc() ? "开启" : "未开启";    
   
$str = array(array(&#39;goods_id&#39;=>13,&#39;number&#39;=>1));    
setcookie("cart", serialize($str));    
echo "magic_quotes_gpc: ".$magic."<br>";    
echo $_COOKIE[&#39;cart&#39;]."<br>";    
print_r(unserialize($_COOKIE[&#39;cart&#39;]));    
?>
登录后复制

大家执行下这段代码可以发现,当你的magic_quotes_gpc关闭时这段程序执行没有任何问题,但是magic_quotes_gpc开启时你会发现反序列化并不成功,这时你可能就知道问题出在哪了?

原因是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是无法反序列化成功的,就出现了问题.

解决的办法简单来说就是将unserialize($_COOKIE['cart'])改成unserialize(stripslashes($_COOKIE['cart'])),在COOKIE前加上stripslashes,去掉转义符,这样就没问题了.

对于cookie影响我们再做个测试:

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[&#39;testcookie&#39;],true)); //取不到值
登录后复制

在没有经过cookie赋值时,正常反序列化,经过cookie之后,取到值为空.

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[&#39;testcookie&#39;]); // string(62) "[{\"key\":\"\\u54c8 \\u903b\"},{\"key\":\"\\u54c8 \\u903b\"}]"   
var_dump(json_decode($_COOKIE[&#39;testcookie&#39;],true));
登录后复制

对比了一下数据,经过cookie处理后多了几个//,解决方法,代码如下:

var_dump(json_decode(stripslashes($_COOKIE[&#39;testcookie&#39;]),true));   
var_dump(json_decode(str_replace("\\","",$_COOKIE[&#39;testcookie&#39;]),true));
登录后复制

总结:magic_quotes_gpc在开启的情况下,会影响通过get|post|cookies获得的数据.所以我们在get|post|cookies处理数据的时候,首先判断magic_quotes_gpc开启情况.

1>在开启情况下,处理数据需要stripslashes

2>在没有开启情况下,接受数据先addslashes,处理数据stripslashes


智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号