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
CodeIgniter实现更改view文件夹路径的方法
Jul 04 PHP
smarty实现多级分类的方法
Dec 05 PHP
PHP中判断文件存在使用is_file还是file_exists?
Apr 03 PHP
Thinkphp3.2.3整合phpqrcode生成带logo的二维码
Jul 21 PHP
PHP数组生成XML格式数据的封装类实例
Nov 10 PHP
php中10个不同等级压缩优化图片操作示例
Nov 14 PHP
php+ajax简单实现全选删除的方法
Dec 06 PHP
解决php-fpm.service not found问题的办法
Jun 06 PHP
php 删除指定文件夹的实例讲解
Jul 25 PHP
php进程daemon化的正确实现方法
Sep 06 PHP
php查看一个变量的占用内存的实例代码
Mar 29 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实现的抓取小说网站内容功能示例
2019/06/27 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
2020/08/11 PHP
理解JSON:3分钟课程
2011/10/28 Javascript
nodejs win7下安装方法
2012/05/24 NodeJs
JavaScript实现MIPS乘法模拟的方法
2015/04/17 Javascript
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
浅析js绑定事件的常用方法
2016/05/15 Javascript
bootstrap css样式之表单
2017/01/19 Javascript
JS数组去重(4种方法)
2017/03/27 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
2017/06/15 Javascript
vue.js国际化 vue-i18n插件的使用详解
2017/07/07 Javascript
iview table render集成switch开关的实例
2018/03/14 Javascript
使用Vue组件实现一个简单弹窗效果
2018/04/23 Javascript
解决IE11 vue +webpack 项目中数据更新后页面没有刷新的问题
2018/09/25 Javascript
angular5 子组件监听父组件传入值的变化方法
2018/09/30 Javascript
es6数据变更同步到视图层的方法
2019/03/04 Javascript
JS实现动态添加外部js、css到head标签的方法
2019/06/05 Javascript
微信小程序实现拖拽功能
2019/09/26 Javascript
vue实现购物车功能(商品分类)
2020/04/20 Javascript
浅谈javascript如何获取文件后缀名
2020/08/07 Javascript
[02:05:03]完美世界DOTA2联赛循环赛 LBZS VS Matador BO2 10.28
2020/10/28 DOTA
Python字典循环添加一键多值的用法实例
2019/01/20 Python
解决django前后端分离csrf验证的问题
2019/02/03 Python
Django 创建后台,配置sqlite3教程
2019/11/18 Python
Python绘制二维曲线的日常应用详解
2019/12/04 Python
Python参数传递实现过程及原理详解
2020/05/14 Python
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
phpquery中文手册
2021/03/18 PHP
计算机专业推荐信范文
2013/11/20 职场文书
粗加工管理制度
2014/02/04 职场文书
改革共识倡议书
2014/08/29 职场文书
观看《周恩来的四个昼夜》思想汇报
2014/09/12 职场文书
2015年社区工会工作总结
2015/05/26 职场文书
幽默口才训练经典句子(48句)
2019/08/19 职场文书
Java字符串逆序方法详情
2022/03/21 Java/Android