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使用pdo连接并查询sql数据库的方法
Dec 24 PHP
CodeIgniter中使用Smarty3基本配置
Jun 29 PHP
Yii基于数组和对象的Model查询技巧实例详解
Dec 28 PHP
CodeIgniter基于Email类发邮件的方法
Mar 29 PHP
PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function
Feb 05 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
PHP实现的多维数组排序算法分析
Feb 10 PHP
自写的利用PDO对mysql数据库增删改查操作类
Feb 19 PHP
php反射学习之不用new方法实例化类操作示例
Jun 14 PHP
PHP进阶学习之依赖注入与Ioc容器详解
Jun 19 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
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
CI框架在CLI下执行占用内存过大问题的解决方法
2014/06/17 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
Laravel中错误与异常处理的用法示例
2018/09/16 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
javascript 进度条 实现代码
2009/07/30 Javascript
深入理解JavaScript系列(12) 变量对象(Variable Object)
2012/01/16 Javascript
Jquery时间验证和转换工具小例子
2013/07/01 Javascript
图片上传判断及预览脚本的效果实例
2013/08/07 Javascript
JS复制到剪贴板示例代码
2013/10/30 Javascript
jQuery网页版打砖块小游戏源码分享
2015/08/20 Javascript
Javascript仿新浪游戏频道鼠标悬停显示子菜单效果
2015/08/21 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
jquery实现列表上下移动功能
2016/02/25 Javascript
BootStrap智能表单实战系列(七)验证的支持
2016/06/13 Javascript
JS+CSS3实现超炫的散列画廊特效
2016/07/16 Javascript
Vue添加请求拦截器及vue-resource 拦截器使用
2017/11/23 Javascript
linux系统使用python获取cpu信息脚本分享
2014/01/15 Python
python的pdb调试命令的命令整理及实例
2017/07/12 Python
python交互式图形编程实例(一)
2017/11/17 Python
对pandas中apply函数的用法详解
2018/04/10 Python
pandas使用apply多列生成一列数据的实例
2018/11/28 Python
Python模块的加载讲解
2019/01/15 Python
Python txt文件加入字典并查询的方法
2019/01/15 Python
Python 正则表达式 re.match/re.search/re.sub的使用解析
2019/07/22 Python
Python 日期区间处理 (本周本月上周上月...)
2019/08/08 Python
Python二元赋值实用技巧解析
2019/10/25 Python
英国排名第一的冲浪店:Ann’s Cottage
2020/06/21 全球购物
工业学校毕业生自荐书
2014/01/03 职场文书
社区工作者感言
2014/03/02 职场文书
决心书标准格式
2014/03/11 职场文书
见习期自我鉴定范文
2014/03/19 职场文书
建设幸福中国演讲稿
2014/09/11 职场文书
法定代表人授权委托书
2014/09/19 职场文书
2014年电信员工工作总结
2014/12/19 职场文书
社区节水倡议书
2015/04/29 职场文书