php中magic_quotes_gpc对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","");  //www.111cn.net
    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)); 

总结:magic_quotes_gpc在开启的情况下,会影响通过get|post|cookies获得的数据.所以我们在get|post|cookies处理数据的时候,
首先判断magic_quotes_gpc开启情况
1>在开启情况下,处理数据需要stripslashes
2>在没有开启情况下,接受数据先addslashes,处理数据stripslashes

时间: 2024-10-07 05:45:39

php中magic_quotes_gpc对unserialize的影响的相关文章

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

本文实例分析了php中magic_quotes_gpc对unserialize的影响.分享给大家供大家参考.具体如下: magic_quotes_gpc是一个php中一个给单双引号增加一些安全过滤的函数,但此函数对于我们使用unserialize函数时会产生一些影响,下面我们就这个问题与大家看几个实例与解决办法. 昨天朋友让我帮他解决下他网站的购物车程序的问题,程序用的是PHPCMS,换空间前是好的,刚换的空间,具体问题是提示成功加入购物车后跳转到购物车页面,购物车里为空. 我看了下代码,大致的

sharepoint-关于SharePoint中使用代码托管是否影响性能的问题,在线等,急!!!

问题描述 关于SharePoint中使用代码托管是否影响性能的问题,在线等,急!!! 详情是这样的 现在在SharePoint一个Web站点下有两套网站,A为原版,B为新版改版,B版需求代码托管,A则不需要,在从A切换到B的时候,我在web.config里面增加了, 当时是没有问题的,正式B版上线,但是第二天早上则出现了访问超慢. 然后我恢复了web.config,将默认网页转回A版首页,异常消失. 问题: 1.代码托管和assembly这两句话对性能是否影响很大? 2.影响网站加载速度的问题一

u盘-请教一下,我做的U盘读取文件使用UCOS系统,加载在整个项目的工程中对其他有没有影响,

问题描述 请教一下,我做的U盘读取文件使用UCOS系统,加载在整个项目的工程中对其他有没有影响, 请教一下,我做的U盘读取文件使用UCOS系统,加载在整个项目的工程中(没有使用操作系统)对其他有没有影响,应该说没有吧,只是占空间

div中的float属性是影响到div本身还是其中的元素啊?

问题描述 div中的float属性是影响到div本身还是其中的元素啊? 在div中的float属性设置right值,那么div中的元素是向右浮动, 但是好像整个div框在父一级容器中也会向右浮动, 那么div中的float属性是影响到div本身还是其中的元素呢? 解决方案 会先影响到自己本身,然后它里面的元素也会跟着影响 解决方案二: 子div的margin属性影响到父div的定位 解决方案三: http://www.cnblogs.com/lrzw32/p/4948514.html:这个讲的挺

c# 运算符在A类中重载后,怎样影响到B类中的运算符

问题描述 c#运算符在A类中重载后,怎样影响到B类中的运算符 解决方案 解决方案二:影响不了,运算符重载只能由类的定义者实现.解决方案三:B类从A类中派生~解决方案四:BclassBaseAclasspublicclassBclass{}publicclassAclass:B{publicstaticAoperator+(Bx,By){//TD:OO你的代码在这里}}

JS修改标签中的文本且不影响其中标签

/********************************************************************* * JS修改标签中的文本且不影响其中标签 * 说明: * 需要修改<a>标签中的显示文本内容,但<a>标签中又有标签. * * 2017-8-31 深圳 龙华樟坑村 曾剑锋 ********************************************************************/ 一.参考文档: 1. get

ASP中函数调用对参数的影响

在ASP编程中,经常需要自己编写一些函数(或过程)来实现某些特定的功能,这时往往需要向函数(或过程)传递相应的参数在函数(或过程)中进行数据处理,即有可能需要保留或改变参数的值,下面有相关范例用下面的函数(TestAddress)就可以使一个函数多个返回值成为可能(一个函数返回值,多个参数改变后的值) 范例: <%@LANGUAGE="VBSCRIPT"%><%Option Explicit '=====================================

DNS全局查询阻止列表对TMG中的WPAD部署的影响

Windows Server 2008 中的 DNS 服务器角色引入了一个全局查询阻止列表,可减少与 DNS 动态更新协议相关的漏洞.这可能会影响 WPAD 部署? 之前在测试TMG单网卡模式下,使用自动检测功能时发现无法ping通wpad.testdomain.com,且客户端自动检测无法查询到此别名记录,但是实际上该配置已经生效,想了好久没有找到问题的原因,后来经查询原因为DNS全局查询阻止列表搞的鬼, 如何取消DNS全局查询阻止列表呢?其实也不是太难,只要在DNS服务器上运行 dnscmd

Oracle中REMOTE_LISTENER对LOAD_BALANCE的影响

如果使用DBCA建立RAC数据库,默认情况下会在各个节点上配置REMOTE_LISTENER参数,因此以前测试的LOAD_BALANCE是在REMOTE_LISTENER存在的情况下进行的测试,这里测试一下去掉REMOTE_LISTENER对LOAD_BALANCE的影响. 数据库环境为10.2.0.4 Rac for Solaris for sparc 64: SQL> SELECT * FROM V$VERSION; BANNER ------------------------------