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 无限分类的树类代码
Dec 03 PHP
使用php发送有附件的电子邮件-(PHPMailer使用的实例分析)
Apr 26 PHP
php使用mb_check_encoding检查字符串在指定的编码里是否有效
Nov 07 PHP
php实现的短网址算法分享
Jun 20 PHP
php计算两个整数的最大公约数常用算法小结
Mar 05 PHP
PHP获取指定日期是星期几的实现方法
Nov 30 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
Jan 12 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
Feb 10 PHP
详解PHP神奇又有用的Trait
Mar 25 PHP
PHP数组与字符串互相转换实例
May 05 PHP
PHP内存溢出优化代码详解
Feb 26 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中用加号与用array_merge合并数组的区别深入分析
2013/06/03 PHP
Yii+upload实现AJAX上传图片的方法
2016/07/13 PHP
jquery ui bootstrap 实现自定义风格
2014/11/14 Javascript
Jquery结合HTML5实现文件上传
2015/06/25 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
jquery ui dialog替代confirm实例分析
2016/01/25 Javascript
javascript的 {} 语句块详解
2016/02/27 Javascript
如何在AngularJs中调用第三方插件库
2017/05/21 Javascript
vue中node_modules中第三方模块的修改使用详解
2019/05/31 Javascript
Vue插件之滑动验证码
2019/09/21 Javascript
vue项目强制清除页面缓存的例子
2019/11/06 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
Python计算字符宽度的方法
2016/06/14 Python
浅谈python日志的配置文件路径问题
2018/04/28 Python
python读取txt文件并取其某一列数据的示例
2019/02/19 Python
python Django 创建应用过程图示详解
2019/07/29 Python
浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法
2019/10/25 Python
linux 下selenium chrome使用详解
2020/04/02 Python
python“静态”变量、实例变量与本地变量的声明示例
2020/11/13 Python
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
应届生财务会计求职信
2013/11/05 职场文书
汽车技术服务与营销专业推荐信
2013/11/29 职场文书
如何写好升职自荐信
2014/01/06 职场文书
护士的自我鉴定
2014/02/07 职场文书
羽毛球社团活动总结
2014/06/27 职场文书
五心教育心得体会
2014/09/04 职场文书
设立有限责任公司出资协议书
2014/11/01 职场文书
2014年保卫科工作总结
2014/12/05 职场文书
集团财务总监岗位职责
2015/04/03 职场文书
帝企鹅日记观后感
2015/06/10 职场文书
党员干部学习三严三实心得体会
2016/01/05 职场文书
2016年情人节广告语
2016/01/28 职场文书
送给客户微信问候语!
2019/07/04 职场文书
详解Java ES多节点任务的高效分发与收集实现
2021/06/30 Java/Android
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis
排查并解决Oracle sysaux表空间异常增长
2022/04/20 Oracle