2009年3月2日 星期一

php的serialize與unserialize

今天遇到一個小問題...
用serialize記下來的資料,在用unserialize轉回原本的型態時..
若有遇到 " (雙引號[double question mark]) 會無法解析回原本的php變數型態

可以在使用serialized轉換前,用 htmlspecialchars()urlencode() 來解決這個問題
但較好的方式是用htmlspecialchars(),這樣的好處是不用再用urldecode()來把它轉換回正常的文字
==========================================================

2010.01.11更新
由於要顯示在textbox裡,用上述方法還是會有漏洞
試了很久,下面這順序應該是比較理想
1.寫入資料庫時,只做urlencode(若要使用addslashes,則在這之前)
  例:$a=urlencode(addslashes($text));
2.前端顯示時,則先解開,然後將slashes去掉,再用htmlspecialchars
  例:$a=htmlspecialchars(stripslashes(urldecode($dbValue)));


稍微記載一下這二者的說明


serialize --- 產生一個可儲存的值的表示
語法 : string serialize (mixed value)
說明 :
serialize( )傳回一個包含由value所表示的byte-stream字串,它能儲存在任何地方。
這可用來儲存或傳遞PHP的值,而不失去它們的型態和結構。
使用unserialize( )能使serialized字串再次成為原來PHP的值。
serialize( )能處理的型態有integer、double、string、array(多面的)、object(物件的屬性將會serialized,但方法則會lose)

unserialize --- 從儲存的值中建立PHP的值
語法 : mixed unserialize (string str)
說明 :
unserialize( )取一個serialized變數,並且將它轉換回PHP的值,傳回轉換後的值,
可以是integer、double、string、array、object。
如果物件有serialized,則它的方法不會保存在所傳回的值之中。


今天遇到一個小問題...
用serialize記下來的資料,在用unserialize轉回原本的型態時..
若有遇到 " (雙引號[double question mark]) 會無法解析回原本的php變數型態

可以在使用serialized轉換前,用 htmlspecialchars()urlencode() 來解決這個問題
但較好的方式是用htmlspecialchars(),這樣的好處是不用再用urldecode()來把它轉換回正常的文字
==========================================================

2010.01.11更新
由於要顯示在textbox裡,用上述方法還是會有漏洞
試了很久,下面這順序應該是比較理想
1.寫入資料庫時,只做urlencode(若要使用addslashes,則在這之前)
  例:$a=urlencode(addslashes($text));
2.前端顯示時,則先解開,然後將slashes去掉,再用htmlspecialchars
  例:$a=htmlspecialchars(stripslashes(urldecode($dbValue)));


稍微記載一下這二者的說明


serialize --- 產生一個可儲存的值的表示
語法 : string serialize (mixed value)
說明 :
serialize( )傳回一個包含由value所表示的byte-stream字串,它能儲存在任何地方。
這可用來儲存或傳遞PHP的值,而不失去它們的型態和結構。
使用unserialize( )能使serialized字串再次成為原來PHP的值。
serialize( )能處理的型態有integer、double、string、array(多面的)、object(物件的屬性將會serialized,但方法則會lose)

unserialize --- 從儲存的值中建立PHP的值
語法 : mixed unserialize (string str)
說明 :
unserialize( )取一個serialized變數,並且將它轉換回PHP的值,傳回轉換後的值,
可以是integer、double、string、array、object。
如果物件有serialized,則它的方法不會保存在所傳回的值之中。