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 相关文章推荐
mysq GBKl乱码
Nov 28 PHP
php下尝试使用GraphicsMagick的缩略图功能
Jan 01 PHP
部署PHP项目应该注意的几点事项分享
Dec 20 PHP
php数据库备份还原类分享
Mar 20 PHP
PHP实现数字补零功能的2个函数介绍
May 12 PHP
常用PHP框架功能对照表
Oct 23 PHP
php实现的SESSION类
Dec 02 PHP
微信API接口大全
Apr 15 PHP
php实现websocket实时消息推送
Mar 30 PHP
PDO::getAttribute讲解
Jan 28 PHP
php libevent 功能与使用方法详解
Mar 04 PHP
PHP http请求超时问题解决方案
Nov 13 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防止注入攻击实例分析
2014/11/03 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
2015/07/29 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
PHP get_html_translation_table()函数用法讲解
2019/02/16 PHP
JQuery datepicker 使用方法
2011/05/20 Javascript
纯JS实现五子棋游戏兼容各浏览器(附源码)
2013/04/24 Javascript
解决jquery1.9不支持browser对象的问题
2013/11/13 Javascript
JS 获取鼠标左右键的键值方法
2014/10/11 Javascript
JavaScript判断变量是否为空的自定义函数分享
2015/01/31 Javascript
JavaScript移除数组内重复元素的方法
2015/03/18 Javascript
js仿黑客帝国字母掉落效果代码分享
2020/11/08 Javascript
关于动态生成dom绑定事件失效的原因及解决方法
2016/08/06 Javascript
jquery实现自定义图片裁剪功能【推荐】
2017/03/08 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
推荐10款扩展Web表单的JS插件
2017/12/25 Javascript
VSCode配置react开发环境的步骤
2017/12/27 Javascript
vue filters的使用详解
2018/06/11 Javascript
支付宝小程序自定义弹窗dialog插件的实现代码
2018/11/30 Javascript
使用node.JS中的url模块解析URL信息
2020/02/06 Javascript
JavaScript实现无限轮播效果
2020/11/19 Javascript
[07:39]第一届亚洲邀请赛回顾视频
2017/02/14 DOTA
Mac 使用python3的matplot画图不显示的解决
2019/11/23 Python
使用pandas的box_plot去除异常值
2019/12/10 Python
python3 logging日志封装实例
2020/04/08 Python
python实现自动清理重复文件
2020/08/24 Python
项目计划书范文
2014/01/09 职场文书
安全生产宣传标语
2014/06/06 职场文书
2015年母亲节寄语
2015/03/23 职场文书
2015年人民调解工作总结
2015/05/18 职场文书
教研活动主持词
2015/07/03 职场文书
跳高加油稿
2015/07/21 职场文书
小学生教师节广播稿
2015/08/19 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
大学生活委员竞选稿
2015/11/21 职场文书
Java Spring 控制反转(IOC)容器详解
2021/10/05 Java/Android
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
2022/05/04 Python