2013-03-21 63 views
0

感謝您查看我的問題。反序列化cookie變量

的代碼:

$array = array("zero","one","true","three"); 
echo $beforecookie = serialize($array); //<<-- IT WORKS; 
print_r(unserialize($beforecookie)); //<<--IT WORKS 

setcookie('mycookie', $beforecookie, time()+3600); 
echo $aftercookie = $_COOKIE['mycookie']; // <<-- it works perfectly same with $beforecookie 

$data = unserialize($aftercookie); 
print_r($data); //<<--RETURN NOTHING (the problem) 
var_dump($data); //<<-- RETURN bool(false); 

的串(從陣列串行化),我從餅乾有不能被解序列化;爲什麼?使用serialize()將它設置爲cookie後,如何返回數組?或者我錯過了什麼?

感謝您的幫助。

+3

** ** NEVER餅乾解序列化數據(或者可以由用戶操縱任何其他字符串)!這是一個重大的安全漏洞。 – ThiefMaster 2013-03-21 13:22:08

+0

您是否有任何反序列化錯誤?檢查日誌 – sectus 2013-03-21 13:24:56

+0

@ThiefMaster,但它有可能嗎? – egig 2013-03-21 13:26:05

回答

0

在腳本執行後設置Cookie以及標題,因此在頁面重新加載之前您無法訪問它。

0

你可以改變你的代碼只有這部分:

if(!$_COOKIE['mycookie']){ 
setcookie('mycookie', $beforecookie, time()+3600); 
} 

然後重新加載頁面...

1

這段代碼:

setcookie('mycookie', $beforecookie, time()+3600); 
echo $aftercookie = $_COOKIE['mycookie'] // <<-- it works perfectly same with $beforecookie 

您設置贏得了餅乾直到瀏覽器刷新頁面才能使用代碼。另外,如果您確實想要這樣做,請確保向基於服務器端機密的cookie添加校驗和,並保存到cookie中的數據內容。看看hash_hmac()。盲目地對從不受信任的來源收到的價值進行串行化簡直是不負責任的。

0

如果你想擁有你的cookie可以立即(而不是之後的其他類似頁面刷新說)只是增加

$_COOKIE['mycookie'] = $beforecookie; 

這條線之後

setcookie('mycookie', $beforecookie, time()+3600); 

您的cookie將立即提供:-)

1

需要使用base64_encode()後功能serialize()

集:

setcookie('name', base64_encode(serialize($arr))); 

得到:

unserialize(base64_decode($_COOKIE['name']));