php中magic_quotes_gpc对unserialize的影响分析


Posted in PHP onDecember 16, 2014

本文实例分析了php中magic_quotes_gpc对unserialize的影响。分享给大家供大家参考。具体如下:

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('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开启时你会发现反序列化并不成功,这时你可能就知道问题出在哪了?

原因是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['testcookie'],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['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开启情况.

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

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

希望本文所述对大家的PHP程序设计有所帮助。

PHP 相关文章推荐
数据库的日期格式转换
Oct 09 PHP
php str_replace的替换漏洞
Mar 15 PHP
开源SNS系统-ThinkSNS
May 18 PHP
php中设置多级目录session的问题
Aug 08 PHP
php多层数组与对象的转换实例代码
Aug 05 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
Dec 11 PHP
PHP使用数组依次替换字符串中匹配项
Jan 08 PHP
php数组分页实现方法
Apr 30 PHP
PHP对称加密函数实现数据的加密解密
Oct 27 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
May 20 PHP
php 使用 __call实现重载功能示例
Nov 18 PHP
ThinkPHP5.1的权限控制怎么写?分享一个AUTH权限控制
Mar 09 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
Dec 16 #PHP
php通过记录IP来防止表单重复提交方法分析
Dec 16 #PHP
PHP使用glob函数遍历目录或文件夹的方法
Dec 16 #PHP
php批量添加数据与批量更新数据的实现方法
Dec 16 #PHP
php中get_meta_tags()、CURL与user-agent用法分析
Dec 16 #PHP
PHP使用array_multisort对多个数组或多维数组进行排序
Dec 16 #PHP
php使用ereg验证文件上传的方法
Dec 16 #PHP
You might like
php auth_http类库进行身份效验
2009/03/19 PHP
PHP面向对象程序设计之接口用法
2014/08/20 PHP
php微信公众开发之获取周边酒店信息的方法
2014/12/22 PHP
php文件夹的创建与删除方法
2015/01/24 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
用javascript作一个通用向导说明
2011/08/30 Javascript
调试Node.JS的辅助工具(NodeWatcher)
2012/01/04 Javascript
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
2013/09/29 Javascript
js 针对html DOM元素操作等经验累积
2014/03/11 Javascript
javascript 获取HTML DOM父、子、临近节点
2014/06/16 Javascript
jquery访问ashx文件示例代码
2014/08/11 Javascript
node+express+jade制作简单网站指南
2014/11/26 Javascript
Node.js中的缓冲与流模块详细介绍
2015/02/11 Javascript
javascript文本框内输入文字倒计数的方法
2015/02/24 Javascript
程序员必知35个jQuery 代码片段
2015/11/05 Javascript
JavaScript知识点总结(十)之this关键字
2016/05/31 Javascript
JS代码实现百度地图 画圆 删除标注
2016/10/12 Javascript
JavaScript Date 知识浅析
2017/01/29 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
2017/12/18 Javascript
Vue2.0学习系列之项目上线的方法步骤(图文)
2018/09/25 Javascript
Vue 之孙组件向爷组件通信的实现
2019/04/23 Javascript
详解Vue项目中实现锚点定位
2019/04/24 Javascript
Vue v-for循环之@click点击事件获取元素示例
2019/11/09 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
Python对列表排序的方法实例分析
2015/05/16 Python
Python原始字符串与Unicode字符串操作符用法实例分析
2017/07/22 Python
python aiohttp的使用详解
2019/06/20 Python
Python绘制热力图示例
2019/09/27 Python
解决Python3下map函数的显示问题
2019/12/04 Python
pandas按条件筛选数据的实现
2021/02/20 Python
websocket+sockjs+stompjs详解及实例代码
2018/11/30 HTML / CSS
美国著名珠宝品牌之一:Jared The Galleria Of Jewelry
2016/10/01 全球购物
民事授权委托书范文
2014/08/02 职场文书
施工安全协议书
2016/03/22 职场文书
2019年“红色之旅”心得体会1000字(3篇)
2019/09/27 职场文书
Windows Server 2012 R2 磁盘分区教程
2022/04/29 Servers