php中magic_quotes_gpc對unserialize的影響

來源:互聯網
上載者:User

昨天朋友讓我幫他解決下他網站的購物車程式的問題,程式用的是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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.