php中magic_quotes_gpc对unserialize的影响分析_php技巧

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

时间: 2024-10-03 18:58:32

php中magic_quotes_gpc对unserialize的影响分析_php技巧的相关文章

php中file_get_contents与curl性能比较分析_php技巧

本文实例讲述了php中file_get_contents与curl性能比较分析.分享给大家供大家参考.具体如下: 在php中如果不仔细的去分析性能会发现file_get_contents与curl两个同很多共同点的,他们都可以采集文件打开文件,但是如果仔细一对比会发现很多不同点,下面我们一起来看看file_get_contents与curl区别. PHP中fopen,file_get_contents,curl函数的区别: 1.fopen /file_get_contents 每次请求都会重新做

php中magic_quotes_gpc对unserialize的影响

昨天朋友让我帮他解决下他网站的购物车程序的问题,程序用的是PHPCMS,换空间前是好的(刚换的空间),具体问题是提示成功加入购物车后跳转到购物车页面,购物车里为空. 我看了下代码,大致的原理就是将产品ID与数量存放到数组中,然后序列化后存入COOKIE中,在购物车页面反序列化COOKIE,得到这个数组并读出对应产品信息. 调试一下发现问题出现在unserialize上. 我先根据它的购物车原理写了段代码:    代码如下 复制代码 <?php       header("Content-t

PHP中json_encode、json_decode与serialize、unserialize的性能测试分析_php技巧

于是便联想到PHP中的对象怎么样序列化存储性价比最高呢?接着想到了之前同事推荐的JSON编码和解码函数. 据他所说,json_encode和json_decode比内置的serialize和unserialize函数要高效. 于是我决定动手实验,证实一下同事所说的情况是否属实. 实验分别在PHP 5.2.13和PHP 5.3.2环境下进行. 用同一个变量,分别用以上方式进行编码或解码10000次,并得出每个函数执行10000次所需的时间. 以下是PHP 5.2.13环境其中一次测试结果: 复制代

PHP中的函数嵌套层数限制分析_php技巧

函数嵌套,这个名字有点纠结,也许不太好理解.一个比较常见的函数嵌套特例:递归函数,即函数自己嵌套自己. 一直以为在PHP中不能有太多的函数嵌套,这是因为在以前某些时候不小心用到了递归,在递归的深度达到100时, 即函数嵌套的层数达到100时,程序会报一个 Fatal error.如下示例: 复制代码 代码如下: function rt() { static $i; echo $i++, '<br />'; rt(); } rt(); die(); 在我的win7 + php5.3的环境下报错如

PHP中addcslashes与stripcslashes函数用法分析_php技巧

本文实例分析了PHP中addcslashes与stripcslashes函数用法.分享给大家供大家参考,具体如下: 在写一个网站的英文版时,写完后填加英文资料,我随便填写时一点问题没有,但每当填加指定的内容时却填加不上,也不报错,我查看了数据库,发现这个字段用的是"TEXT"数据数型,我以为是内容过长的原因,于是我把数据类型改成了"longtext",但提交时发现还是出现同样的问题.下面我们给大家介绍一下addcslashes函数吧! 后来请教同事,同事发现在是英文

php中strlen和mb_strlen用法实例分析_php技巧

本文实例分析了php中strlen和mb_strlen用法.分享给大家供大家参考,具体如下: 首先看如下代码(文件编码utf8): <?php $utf8_string = "abcd我你他她它"; var_dump(strlen($utf8_string)); var_dump(mb_strlen($utf8_string, 'gb2312')); var_dump(mb_strlen($utf8_string, 'utf8')); var_dump(mb_strlen($ut

php curl中gzip的压缩性能测试实例分析_php技巧

本文实例分析了php curl中gzip的压缩性能测试.分享给大家供大家参考,具体如下: 前因: 请求接口次数很多,每日两亿多次,主要是有些接口返回数据量很大高达110KB(为了减少请求次数,将多个接口合并成一个导致的). 后端接口的nginx已经开启gzip,所以做个测试,看看是否在请求时使用压缩解压 php CURL 的扩展安装这里就不说了 用到的curl的两个参数 //在http 请求头加入 gzip压缩 curl_setopt($ch, CURLOPT_HTTPHEADER, array

php magic_quotes_gpc的一点认识与分析_php技巧

blankyao 说"学习的过程就是不断的发现错误,不断的改正错误": 先看下手册上怎么说的吧! 对一般人来说看下前两段就可以了 Magic Quotes 代码: Magic Quotes is a process that automagically escapes incoming data to the PHP script. It's preferred to code with magic quotes off and to instead escape the data a

Discuz 5.0 中读取纯真IP数据库函数分析_php技巧

Discuz  5.0 不在使用自己的IP数据,而是使用纯真IP的数据格式, 存取纯真IP数据库稍微有点麻烦,它的存储格式比较特殊也很有趣,具体的格式分析参考下面两个链接,其他语言实现参考文章末的链接. <纯真IP数据库格式详解> 链接一:http://blog.csdn.net/heiyeshuwu/archive/2006/05/12/725675.aspx 链接二:http://lumaqq.linuxsir.org/article/qqwry_format_detail.html 纯真