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
php设计模式 Bridge (桥接模式)
Jun 26 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
Oct 08 PHP
克隆一个新项目的快捷方式
Apr 10 PHP
基于php下载文件的详解
Jun 02 PHP
解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别
Jun 24 PHP
DOM XPATH获取img src值的query
Sep 23 PHP
php实现下载限制速度示例分享
Feb 13 PHP
实现获取http内容的php函数分享
Feb 16 PHP
php中mt_rand()随机数函数用法
Nov 24 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
Sep 28 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
Oct 16 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
input的focus方法使用
2010/03/13 Javascript
js获取元素在浏览器中的绝对位置
2010/07/24 Javascript
JavaScript 获取当前时间戳的代码
2010/08/05 Javascript
Three.js源码阅读笔记(基础的核心Core对象)
2012/12/27 Javascript
特殊情况下如何获取span里面的值
2014/05/20 Javascript
Express作者TJ告别Node.js奔向Go
2014/07/14 Javascript
详解JavaScript的Polymer框架中的通知交互
2015/07/29 Javascript
jQuery实现控制文字内容溢出用省略号(…)表示的方法
2016/02/26 Javascript
jquery延迟对象解析
2016/10/26 Javascript
原生的强大DOM选择器querySelector介绍
2016/12/21 Javascript
webpack配置sass模块的加载的方法
2017/07/30 Javascript
详解express与koa中间件模式对比
2017/08/07 Javascript
详解使用angular的HttpClient搭配rxjs
2017/09/01 Javascript
vue.js项目打包上线的图文教程
2017/11/16 Javascript
node前端模板引擎Jade之标签的基本写法
2018/05/11 Javascript
Vue响应式原理Observer、Dep、Watcher理解
2019/06/06 Javascript
vue router总结 $router和$route及router与 router与route区别
2019/07/05 Javascript
vue实现简单图片上传
2020/06/30 Javascript
[00:12]2018DOTA2亚洲邀请赛 Somnus丶M出阵单挑
2018/04/06 DOTA
[48:32]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python共享引用(多个变量引用)示例代码
2013/12/04 Python
Python 操作文件的基本方法总结
2017/08/10 Python
Python callable()函数用法实例分析
2018/03/17 Python
numpy添加新的维度:newaxis的方法
2018/08/02 Python
查看python安装路径及pip安装的包列表及路径
2019/04/03 Python
关于PyTorch源码解读之torchvision.models
2019/08/17 Python
python程序 线程队列queue使用方法解析
2019/09/23 Python
Python 单例设计模式用法实例分析
2019/09/23 Python
Python内置方法实现字符串的秘钥加解密(推荐)
2019/12/09 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
HTML5单选框、复选框、下拉菜单、文本域的实现代码
2020/12/01 HTML / CSS
英国计算机产品零售商:Novatech(定制个人电脑、笔记本电脑、工作站和服务器)
2018/01/28 全球购物
生物工程专业求职信
2014/09/03 职场文书
四风问题查摆剖析材料
2014/10/11 职场文书
mysql中整数数据类型tinyint详解
2021/12/06 MySQL
python接口测试返回数据为字典取值方式
2022/02/12 Python