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静态新闻列表自动生成代码
Jun 14 PHP
php合并数组array_merge函数运算符加号与的区别
Oct 31 PHP
php获取后台Job管理的实现代码
Jun 10 PHP
PHP调用Webservice实例代码
Jul 29 PHP
php中文验证码实现示例分享
Jan 12 PHP
利用php下载xls文件(自己动手写的)
Apr 18 PHP
php简单实现屏蔽指定ip段用户的访问
Apr 29 PHP
简单谈谈php中的unicode和utf8编码
Jun 10 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
Jun 13 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
Sep 26 PHP
PHP下载大文件失败并限制下载速度的实例代码
May 10 PHP
Laravel框架控制器的request与response用法示例
Sep 30 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如何解决无法上传大于8M的文件问题
2014/03/10 PHP
thinkphp在模型中自动完成session赋值示例代码
2014/09/09 PHP
PHP中通过trigger_error触发PHP错误示例
2015/06/23 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2006/11/24 Javascript
javascript window对象属性整理
2009/10/24 Javascript
在每个匹配元素的外部插入新元素的方法
2013/12/20 Javascript
js读写json文件实例代码
2014/10/21 Javascript
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
js 获取今天以及过去日期
2017/04/11 Javascript
vue、react等单页面项目应该这样子部署到服务器
2018/01/03 Javascript
Vue精简版风格指南(推荐)
2018/01/30 Javascript
详解在React-Native中持久化redux数据
2019/05/22 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
Vue数组响应式操作及高阶函数使用代码详解
2020/08/01 Javascript
[04:03]DOTA2肉山黑名单梦之声 风暴之灵中文配音鉴赏
2013/07/03 DOTA
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
初学Python函数的笔记整理
2015/04/07 Python
pygame学习笔记(1):矩形、圆型画图实例
2015/04/15 Python
Flask框架中密码的加盐哈希加密和验证功能的用法详解
2016/06/07 Python
Python如何实现守护进程的方法示例
2017/02/08 Python
通过Pandas读取大文件的实例
2018/06/07 Python
Python使用ConfigParser模块操作配置文件的方法
2018/06/29 Python
对Python Pexpect 模块的使用说明详解
2019/02/14 Python
python把1变成01的步骤总结
2019/02/27 Python
用python中的matplotlib绘制方程图像代码
2019/11/21 Python
CSS3中伪元素::before和::after的用法示例
2017/09/18 HTML / CSS
Brookstone美国官网:独特新奇产品
2017/03/04 全球购物
荷兰网上买鞋:MooieSchoenen.nl
2017/09/12 全球购物
英国马匹装备和马术用品购物网站:Equine Superstore
2019/03/03 全球购物
NHL官方在线商店:Shop.NHL.com
2020/05/01 全球购物
C#里面如何倒序排列一个数组的元素?
2013/06/21 面试题
关于青春的演讲稿800字
2014/08/22 职场文书
协会周年庆活动方案
2014/08/26 职场文书
农村党支部书记四风问题个人对照检查材料
2014/09/21 职场文书
教师自查自纠工作情况报告
2014/10/29 职场文书
多台电脑共享文件怎么设置?多台电脑共享文件操作教程
2022/04/08 数码科技