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 相关文章推荐
PHP新手上路(五)
Oct 09 PHP
PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
Apr 09 PHP
PHP中如何调用webservice的实例参考
Apr 25 PHP
根据中文裁减字符串函数的php代码
Dec 03 PHP
PHP5.5和之前的版本empty函数的不同之处
Jun 13 PHP
Thinkphp模板中截取字符串函数简介
Jun 17 PHP
PHP结合JQueryJcrop实现图片裁切实例详解
Jul 24 PHP
php中json_encode不兼容JSON_UNESCAPED_UNICODE的解决方案
May 31 PHP
Symfony2针对输入时间进行查询的方法分析
Jun 28 PHP
PHP实现的简单在线计算器功能示例
Aug 02 PHP
Laravel框架实现简单的学生信息管理平台案例
May 07 PHP
PHP查找一列有序数组是否包含某值的方法
Feb 07 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
PHP4和PHP5共存于一系统
2006/11/17 PHP
yii,CI,yaf框架+smarty模板使用方法
2015/12/29 PHP
php简单获取复选框值的方法
2016/05/11 PHP
Yii统计不同类型邮箱数量的方法
2016/10/18 PHP
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
input按钮的事件处理大全
2010/12/10 Javascript
IE和Firefox的Javascript兼容性总结[推荐收藏]
2011/10/19 Javascript
让AJAX不依赖后端接口实现方案
2012/12/03 Javascript
使用jQuery重置(reset)表单的方法
2014/05/05 Javascript
JavaScript中跨域调用Flash的方法
2014/08/11 Javascript
JavaScript闭包详解
2015/02/02 Javascript
Javascript连接Access数据库完整实例
2015/08/03 Javascript
最丑的时钟效果!js canvas时钟制作方法
2016/08/15 Javascript
JS实现鼠标滑过显示边框的菜单效果
2016/09/21 Javascript
一个基于react的图片裁剪组件示例
2018/04/18 Javascript
vue中$refs的用法及作用详解
2018/04/24 Javascript
详解JavaScript中的坐标和距离
2019/05/27 Javascript
使用Vue 实现滑动验证码功能
2019/06/27 Javascript
Element Card 卡片的具体使用
2020/07/26 Javascript
python计算时间差的方法
2015/05/20 Python
python检测是文件还是目录的方法
2015/07/03 Python
视觉直观感受若干常用排序算法
2017/04/13 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
2018/08/31 Python
用python写一个定时提醒程序的实现代码
2019/07/22 Python
PIL对上传到Django的图片进行处理并保存的实例
2019/08/07 Python
python属于软件吗
2020/06/18 Python
pandas apply多线程实现代码
2020/08/17 Python
如何基于python实现年会抽奖工具
2020/10/20 Python
Python从MySQL数据库中面抽取试题,生成试卷
2021/01/14 Python
Html5 new XMLHttpRequest()监听附件上传进度
2021/01/14 HTML / CSS
信访稳定工作汇报
2014/10/27 职场文书
乡镇法制宣传日活动总结
2015/05/05 职场文书
如何用python清洗文件中的数据
2021/06/18 Python
常用的MongoDB查询语句的示例代码
2021/07/25 MongoDB
JavaScript 原型与原型链详情
2021/11/02 Javascript