国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

php中magic_quotes_gpc對unserialize的影響分析

2024-05-04 23:29:01
字體:
供稿:網(wǎng)友
這篇文章主要介紹了php中magic_quotes_gpc對unserialize的影響,以實(shí)例的形式分析了magic_quotes_gpc安全過濾對unserialize造成的影響以及對此的解決方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
 
 

本文實(shí)例分析了php中magic_quotes_gpc對unserialize的影響。分享給大家供大家參考。具體如下:

magic_quotes_gpc是一個(gè)php中一個(gè)給單雙引號增加一些安全過濾的函數(shù),但此函數(shù)對于我們使用unserialize函數(shù)時(shí)會產(chǎn)生一些影響,下面我們就這個(gè)問題與大家看幾個(gè)實(shí)例與解決辦法.

昨天朋友讓我?guī)退鉀Q下他網(wǎng)站的購物車程序的問題,程序用的是PHPCMS,換空間前是好的,剛換的空間,具體問題是提示成功加入購物車后跳轉(zhuǎn)到購物車頁面,購物車?yán)餅榭?

我看了下代碼,大致的原理就是將產(chǎn)品ID與數(shù)量存放到數(shù)組中,然后序列化后存入COOKIE中,在購物車頁面反序列化COOKIE,得到這個(gè)數(shù)組并讀出對應(yīng)產(chǎn)品信息.

調(diào)試一下發(fā)現(xiàn)問題出現(xiàn)在unserialize上,我先根據(jù)它的購物車原理寫了段代碼,代碼如下:

復(fù)制代碼代碼如下:
<?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']));    
?>

大家執(zhí)行下這段代碼可以發(fā)現(xiàn),當(dāng)你的magic_quotes_gpc關(guān)閉時(shí)這段程序執(zhí)行沒有任何問題,但是magic_quotes_gpc開啟時(shí)你會發(fā)現(xiàn)反序列化并不成功,這時(shí)你可能就知道問題出在哪了?

 

原因是magic_quotes_gpc開啟時(shí),系統(tǒng)會自動(dòng)對POST GET COOKIE的結(jié)果中的單引號進(jìn)行轉(zhuǎn)義,加上/,所以$_COOKIE['cart']的值就變成了a:1:{i:0;a:2:{s:8:/"goods_id/";i:13;s:6:/"number/";i:1;}},這樣的話unserialize是無法反序列化成功的,就出現(xiàn)了問題.

解決的辦法簡單來說就是將unserialize($_COOKIE['cart'])改成unserialize(stripslashes($_COOKIE['cart'])),在COOKIE前加上stripslashes,去掉轉(zhuǎn)義符,這樣就沒問題了.

對于cookie影響我們再做個(gè)測試:

1.問題:項(xiàng)目數(shù)據(jù)需要序列化保存在cookie中,然后再獲得cookie的數(shù)據(jù)反序列,獲得原數(shù)據(jù),代碼如下:

復(fù)制代碼代碼如下:
$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)); //取不到值

在沒有經(jīng)過cookie賦值時(shí),正常反序列化,經(jīng)過cookie之后,取到值為空.

 

2.分析,代碼如下:

復(fù)制代碼代碼如下:
$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));

對比了一下數(shù)據(jù),經(jīng)過cookie處理后多了幾個(gè)//,解決方法,代碼如下:
復(fù)制代碼代碼如下:
var_dump(json_decode(stripslashes($_COOKIE['testcookie']),true));   
var_dump(json_decode(str_replace("//","",$_COOKIE['testcookie']),true));

3.總結(jié):magic_quotes_gpc在開啟的情況下,會影響通過get|post|cookies獲得的數(shù)據(jù).所以我們在get|post|cookies處理數(shù)據(jù)的時(shí)候,首先判斷magic_quotes_gpc開啟情況.

 

① 在開啟情況下,處理數(shù)據(jù)需要stripslashes

② 在沒有開啟情況下,接受數(shù)據(jù)先addslashes,處理數(shù)據(jù)stripslashes

希望本文所述對大家的PHP程序設(shè)計(jì)有所幫助。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 呼和浩特市| 义马市| 搜索| 广河县| 冀州市| 富蕴县| 即墨市| 玛纳斯县| 县级市| 广德县| 论坛| 桃园县| 绥中县| 吉林市| 安宁市| 绥德县| 同心县| 井研县| 南充市| 巨野县| SHOW| 麻江县| 花垣县| 双江| 通道| 九台市| 家居| 万荣县| 星子县| 海宁市| 吕梁市| 宁蒗| 叙永县| 闽侯县| 益阳市| 昭通市| 尉犁县| 出国| 寿宁县| 中西区| 绥德县|