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 Sql Server连接失败问题及解决办法
Aug 07 PHP
PHP中替换换行符的几种方法小结
Oct 15 PHP
PHP的fsockopen、pfsockopen函数被主机商禁用的解决办法
Jul 08 PHP
php调用KyotoTycoon简单实例
Apr 02 PHP
隐性调用php程序的方法
Jun 13 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
Oct 09 PHP
php实现的简单数据库操作Model类
Nov 16 PHP
PHP微信分享开发详解
Jan 14 PHP
一键生成各种尺寸Icon的php脚本(实例)
Feb 08 PHP
PHP运用foreach神奇的转换数组(实例讲解)
Feb 01 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
Sep 30 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
Jan 23 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个人网站架设连环讲(一)
2006/10/09 PHP
注意:php5.4删除了session_unregister函数
2013/08/05 PHP
thinkphp的dump函数无输出实例代码
2016/11/15 PHP
PHP htmlentities()函数用法讲解
2019/02/25 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
2019/03/28 PHP
phpinfo的知识点总结
2019/10/10 PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
2020/04/23 PHP
深入分析js的冒泡事件
2014/12/05 Javascript
简介可以自动完成UI的AngularJS工具angular-smarty
2015/06/23 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
2015/10/14 Javascript
关注jquery技巧提高jquery技能(前端开发必学)
2015/11/02 Javascript
理解Koa2中的async&amp;await的用法
2018/02/05 Javascript
React 源码中的依赖注入方法
2018/11/07 Javascript
node.js的http.createServer过程深入解析
2019/06/06 Javascript
Vue中实现权限控制的方法示例
2019/06/07 Javascript
JS计算斐波拉切代码实例
2019/09/12 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
2020/02/10 Javascript
Python3使用requests包抓取并保存网页源码的方法
2016/03/15 Python
Python实现将文本生成二维码的方法示例
2017/07/18 Python
python去除扩展名的实例讲解
2018/04/23 Python
python读取LMDB中图像的方法
2018/07/02 Python
Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算
2018/12/28 Python
python Manager 之dict KeyError问题的解决
2019/12/21 Python
pytorch:实现简单的GAN示例(MNIST数据集)
2020/01/10 Python
Python接口测试get请求过程详解
2020/02/28 Python
Currentbody法国:健康与美容高科技产品
2020/08/16 全球购物
Nike俄罗斯官方网站:Nike RU
2021/03/05 全球购物
2014年学校卫生工作总结
2014/11/20 职场文书
材料采购员岗位职责
2015/04/03 职场文书
专职安全员岗位职责
2015/04/11 职场文书
婚礼家长致辞
2015/07/27 职场文书
婚礼上证婚人致辞
2015/07/28 职场文书
保护环境建议书作文500字
2015/09/14 职场文书
中学教代会开幕词
2016/03/04 职场文书
利用JuiceFS使MySQL 备份验证性能提升 10 倍
2022/03/17 MySQL
Win11右下角图标点了没反应怎么办?Win11点击右下角图标无反应解决方法汇总
2022/07/07 数码科技