《PHP教程:php中magic_quotes_gpc對unserialize的影響分析》要點(diǎn):
本文介紹了PHP教程:php中magic_quotes_gpc對unserialize的影響分析,希望對您有用。如果有疑問,可以聯(lián)系我們。
PHP教程本文實(shí)例分析了php中magic_quotes_gpc對unserialize的影響.分享給大家供大家參考.具體如下:
PHP教程magic_quotes_gpc是一個php中一個給單雙引號增加一些平安過濾的函數(shù),但此函數(shù)對于我們使用unserialize函數(shù)時會產(chǎn)生一些影響,下面我們就這個問題與大家看幾個實(shí)例與解決辦法.
PHP教程昨天朋友讓我?guī)退k理下他網(wǎng)站的購物車程序的問題,程序用的是PHPCMS,換空間前是好的,剛換的空間,具體問題是提示成功加入購物車后跳轉(zhuǎn)到購物車頁面,購物車?yán)餅榭?
PHP教程我看了下代碼,大致的原理就是將產(chǎn)品ID與數(shù)量存放到數(shù)組中,然后序列化后存入COOKIE中,在購物車頁面反序列化COOKIE,得到這個數(shù)組并讀出對應(yīng)產(chǎn)品信息.
PHP教程調(diào)試一下發(fā)現(xiàn)問題出現(xiàn)在unserialize上,我先根據(jù)它的購物車原理寫了段代碼,代碼如下:
代碼如下:
<?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)閉時這段程序執(zhí)行沒有任何問題,但是magic_quotes_gpc開啟時你會發(fā)現(xiàn)反序列化并不成功,這時你可能就知道問題出在哪了?
PHP教程原因是magic_quotes_gpc開啟時,系統(tǒ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)了問題.
PHP教程解決的方法簡單來說就是將unserialize($_COOKIE['cart'])改成unserialize(stripslashes($_COOKIE['cart'])),在COOKIE前加上stripslashes,去掉轉(zhuǎn)義符,這樣就沒問題了.
PHP教程對于cookie影響我們再做個測試:
PHP教程1.問題:項(xiàng)目數(shù)據(jù)需要序列化保存在cookie中,然后再獲得cookie的數(shù)據(jù)反序列,獲得原數(shù)據(jù),代碼如下:
代碼如下:
$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賦值時,正常反序列化,經(jīng)過cookie之后,取到值為空.
PHP教程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));
對比了一下數(shù)據(jù),經(jīng)過cookie處理后多了幾個//,解決辦法,代碼如下:
代碼如下:
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ù)的時候,首先判斷magic_quotes_gpc開啟情況.
PHP教程① 在開啟情況下,處理數(shù)據(jù)需要stripslashes
PHP教程② 在沒有開啟情況下,接受數(shù)據(jù)先addslashes,處理數(shù)據(jù)stripslashes
PHP教程希望本文所述對大家的PHP程序設(shè)計(jì)有所贊助.
維易PHP培訓(xùn)學(xué)院每天發(fā)布《PHP教程:php中magic_quotes_gpc對unserialize的影響分析》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/13382.html