php中magic_quotes_gpc对unserialize的影响分析

2015-01-24信息快讯网

这篇文章主要介绍了php中magic_quotes_gpc对unserialize的影响,以实例的形式分析了magic_quotes_gpc安全过滤对unserialize造成的影响以及对此的解决方法,非常具有实用价值,需要的朋友可以参考下

本文实例分析了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程序设计有所帮助。

ucenter通信原理分析
PHP中new static() 和 new self() 的区别介绍
php计划任务之ignore_user_abort函数实现方法
CI框架中site_url()和base_url()的区别
WampServer下安装多个版本的PHP、mysql、apache图文教程
PHP和Shell实现检查SAMBA与NFS Server是否存在
php读取mssql的ntext字段返回值为空的解决方法
VPS中使用LNMP安装WordPress教程
解决phpcms更换javascript的幻灯片代码调用图片问题
PHP中mysqli_affected_rows作用行数返回值分析
php连接与操作PostgreSQL数据库的方法
PHP_SELF,SCRIPT_NAME,REQUEST_URI区别
php将access数据库转换到mysql数据库的方法
php实现refresh刷新页面批量导入数据的方法
腾讯微博提示missing parameter errorcode 102 错误的解决方法
php提示Failed to write session data错误的解决方法
phpmyadmin提示The mbstring extension is missing的解决方法
非常实用的PHP常用函数汇总
php提示Warning:mysql_fetch_array() expects的解决方法
php中get_meta_tags()、CURL与user-agent用法分析
yii2.0之GridView自定义按钮和链接用法
php使用pdo连接报错Connection failed SQLSTATE的解决方法
PHP实现的sqlite数据库连接类
php自定文件保存session的方法
php通过session防url攻击方法
php利用cookies实现购物车的方法
Codeigniter框架实现获取分页数据和总条数的方法
Yii的CDbCriteria查询条件用法实例
Yii使用ajax验证显示错误messagebox的解决方法
Yii中CGridView关联表搜索排序方法实例详解
Yii把CGridView文本框换成下拉框的方法
php实现的SESSION类
Yii核心组件AssetManager原理分析
php中print(),print_r(),echo()的区别详解
Codeigniter购物车类不能添加中文的解决方法
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
©2014-2024 dbsqp.com