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脚本的10个技巧(3)
Oct 09 PHP
来自PHP.NET的入门教程
Oct 09 PHP
PHP 得到根目录的 __FILE__ 常量
Jul 23 PHP
php引用计数器进行垃圾收集机制介绍
Sep 19 PHP
学习php设计模式 php实现命令模式(command)
Dec 08 PHP
php解决DOM乱码的方法示例代码
Nov 20 PHP
php格式文件打开的四种方法
Feb 24 PHP
PHP实时统计中文字数和区别
Feb 28 PHP
PHP中str_split()函数的用法讲解
Apr 11 PHP
php中对象引用和复制实例分析
Aug 14 PHP
解决Laravel 不能创建 migration 的问题
Oct 09 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
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
农民C键的运用技巧
2020/03/04 星际争霸
php str_replace替换指定次数的方法详解
2017/05/05 PHP
Yii框架实现对数据库的CURD操作示例
2019/09/03 PHP
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
JQuery实现的图文自动轮播效果插件
2015/06/19 Javascript
SWFUpload多文件上传及文件个数限制的方法
2016/05/31 Javascript
jQuery获取多种input值的简单实现方法
2016/06/20 Javascript
AngularJS轻松实现双击排序的功能
2016/08/30 Javascript
js实现可旋转的立方体模型
2016/10/16 Javascript
js正则表达式验证表单【完整版】
2017/03/06 Javascript
ES6中Symbol类型用法实例详解
2017/04/06 Javascript
JavaScript订单操作小程序完整版
2017/06/23 Javascript
关于页面刷新vuex数据消失问题解决方案
2017/07/03 Javascript
小程序tab页无法传递参数的方法
2018/08/03 Javascript
关于vue利用postcss-pxtorem进行移动端适配的问题
2019/11/20 Javascript
Vue项目接入Paypal实现示例详解
2020/06/04 Javascript
vue 弹出遮罩层样式实例
2020/07/22 Javascript
Vue开发中常见的套路和技巧总结
2020/11/24 Vue.js
python操作sqlite的CRUD实例分析
2015/05/08 Python
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
python爬虫实现教程转换成 PDF 电子书
2017/02/19 Python
Python使用指定字符长度切分数据示例
2019/12/05 Python
python 实现在shell窗口中编写print不向屏幕输出
2020/02/19 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
CSS3 @media的基本用法总结
2019/09/10 HTML / CSS
土耳其时尚购物网站:Morhipo
2017/09/04 全球购物
Nike法国官方网站:Nike.com FR
2018/07/22 全球购物
公司培训心得体会
2014/01/03 职场文书
生物科学专业职业规划书范文
2014/02/11 职场文书
《乌塔》教学反思
2014/02/17 职场文书
奥利奥广告词
2014/03/20 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
2015试用期转正工作总结
2014/12/12 职场文书
朝花夕拾读书笔记
2015/06/29 职场文书
董事长年会致辞
2015/07/29 职场文书
2016猴年春节慰问信
2015/11/30 职场文书