php中magic_quotes_gpc對(duì)unserialize的影響分析
本文實(shí)例分析了php中magic_quotes_gpc對(duì)unserialize的影響。分享給大家供大家參考。具體如下:
magic_quotes_gpc是一個(gè)php中一個(gè)給單雙引號(hào)增加一些安全過(guò)濾的函數(shù),但此函數(shù)對(duì)于我們使用unserialize函數(shù)時(shí)會(huì)產(chǎn)生一些影響,下面我們就這個(gè)問(wèn)題與大家看幾個(gè)實(shí)例與解決辦法.
昨天朋友讓我?guī)退鉀Q下他網(wǎng)站的購(gòu)物車(chē)程序的問(wèn)題,程序用的是PHPCMS,換空間前是好的,剛換的空間,具體問(wèn)題是提示成功加入購(gòu)物車(chē)后跳轉(zhuǎn)到購(gòu)物車(chē)頁(yè)面,購(gòu)物車(chē)?yán)餅榭?
我看了下代碼,大致的原理就是將產(chǎn)品ID與數(shù)量存放到數(shù)組中,然后序列化后存入COOKIE中,在購(gòu)物車(chē)頁(yè)面反序列化COOKIE,得到這個(gè)數(shù)組并讀出對(duì)應(yīng)產(chǎn)品信息.
調(diào)試一下發(fā)現(xiàn)問(wèn)題出現(xiàn)在unserialize上,我先根據(jù)它的購(gòu)物車(chē)原理寫(xiě)了段代碼,代碼如下:
header("Content-type: text/html; charset=utf-8");
$magic = get_magic_quotes_gpc() ? "開(kāi)啟" : "未開(kāi)啟";
$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í)行沒(méi)有任何問(wèn)題,但是magic_quotes_gpc開(kāi)啟時(shí)你會(huì)發(fā)現(xiàn)反序列化并不成功,這時(shí)你可能就知道問(wèn)題出在哪了?
原因是magic_quotes_gpc開(kāi)啟時(shí),系統(tǒng)會(huì)自動(dòng)對(duì)POST GET COOKIE的結(jié)果中的單引號(hào)進(jìn)行轉(zhuǎn)義,加上\,所以$_COOKIE['cart']的值就變成了a:1:{i:0;a:2:{s:8:\"goods_id\";i:13;s:6:\"number\";i:1;}},這樣的話unserialize是無(wú)法反序列化成功的,就出現(xiàn)了問(wèn)題.
解決的辦法簡(jiǎn)單來(lái)說(shuō)就是將unserialize($_COOKIE['cart'])改成unserialize(stripslashes($_COOKIE['cart'])),在COOKIE前加上stripslashes,去掉轉(zhuǎn)義符,這樣就沒(méi)問(wèn)題了.
對(duì)于cookie影響我們?cè)僮鰝€(gè)測(cè)試:
1.問(wèn)題:項(xiàng)目數(shù)據(jù)需要序列化保存在cookie中,然后再獲得cookie的數(shù)據(jù)反序列,獲得原數(shù)據(jù),代碼如下:
$a[1] = array("key"=>"哈 邏");
$jsona = json_encode($a);
setcookie("testcookie","");
setcookie("testcookie",$jsona);
var_dump($jsona,true); //正常取值
var_dump(json_decode($_COOKIE['testcookie'],true)); //取不到值
在沒(méi)有經(jīng)過(guò)cookie賦值時(shí),正常反序列化,經(jīng)過(guò)cookie之后,取到值為空.
2.分析,代碼如下:
$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));
對(duì)比了一下數(shù)據(jù),經(jīng)過(guò)cookie處理后多了幾個(gè)//,解決方法,代碼如下:
var_dump(json_decode(str_replace("\\","",$_COOKIE['testcookie']),true));
3.總結(jié):magic_quotes_gpc在開(kāi)啟的情況下,會(huì)影響通過(guò)get|post|cookies獲得的數(shù)據(jù).所以我們?cè)趃et|post|cookies處理數(shù)據(jù)的時(shí)候,首先判斷magic_quotes_gpc開(kāi)啟情況.
① 在開(kāi)啟情況下,處理數(shù)據(jù)需要stripslashes
② 在沒(méi)有開(kāi)啟情況下,接受數(shù)據(jù)先addslashes,處理數(shù)據(jù)stripslashes
希望本文所述對(duì)大家的PHP程序設(shè)計(jì)有所幫助。
- 詳解php中serialize()和unserialize()函數(shù)
- php序列化函數(shù)serialize() 和 unserialize() 與原生函數(shù)對(duì)比
- php函數(shù)serialize()與unserialize()用法實(shí)例
- php中unserialize返回false的解決方法
- 淺談php函數(shù)serialize()與unserialize()的使用方法
- 淺談php serialize()與unserialize()的用法
- 非常好用的兩個(gè)PHP函數(shù) serialize()和unserialize()
- PHP中json_encode、json_decode與serialize、unserialize的性能測(cè)試分析
- php serialize()與unserialize() 不完全研究
相關(guān)文章
php簡(jiǎn)單定時(shí)執(zhí)行任務(wù)的實(shí)現(xiàn)方法
這篇文章主要介紹了php簡(jiǎn)單定時(shí)執(zhí)行任務(wù)的實(shí)現(xiàn)方法,涉及curl及sleep等操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02PHP獲取photoshop寫(xiě)入圖片文字信息的方法
這篇文章主要介紹了PHP獲取photoshop寫(xiě)入圖片文字信息的方法,涉及php操作圖片的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03php實(shí)現(xiàn)的驗(yàn)證碼文件類實(shí)例
這篇文章主要介紹了php實(shí)現(xiàn)的驗(yàn)證碼文件類,實(shí)例分析了php生成驗(yàn)證碼文件的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-06-06如何解決php domdocument找不到的問(wèn)題
在本篇文章里小編給大家整理的是一篇關(guān)于php domdocument找不到的解決辦法,有需要的朋友們可以跟著學(xué)習(xí)參考下。2021-07-07