【PHP】オブジェクトをシリアル化するときの注意点

今回のネタは、時間がないので備忘録より抜粋。
書いたときから時間が経ってるので、自分でもも忘れてました><

シリアル化の基本

シリアル化とは配列などのデータ型を再現可能な、
受け渡ししやすい形に変換すること。
主にセッションでの受け渡しや、DB保存して行うことが多いです。
で、PHPでのシリアル化の方法は

PHP4以降からは、オブジェクトもシリアライズ可能になりました。
シリアル化のさらに詳しい説明はこちら
PHPのTIPS :: シリアル化(ささら庵:プログラム:PHP)

オブジェクトはシリアル化だけで終わっちゃいけない

一見簡単そうなオブジェクトのシリアル化ですが、ここで落とし穴が。
こっちのマニュアルでは書いてなくて、こっちのマニュアルには書いてあるのですが、
privateとprotectedメンバの前後にはNULLバイトが入ってくるとか…!
これをそのままDBに保存すると…文字化けします…orz
私はここで小一時間詰まりました(;_;)
ちゃんと書いておいてくれよう!!
どんな状況になってるのかは以下を参照
2008/11/03 PHP でオブジェクトのシリアライズ (HiNa) - fetus Diary - fetus



じゃあどうするのかというと、シリアライズした後「addslashes()」で文字列をクオート、非シリアライズする前に「stripcslashes()」でクオートを取り除いておけばOK。
…と思ったけど、addslashes()には脆弱性があるそうな。
addslashes() による SQL 文字列のエスケープ回避問題(t_komuraの日記)

詳しいことは今度調べますが、Shift_JIS以外の文字コードを使用して、mysql_real_escape_string()かPrepared Statementsでクエリを発行したら良さそう。



て。ここまでしっかりエスケープ処理してたら、普通、NULLバイトのバグには遭遇しませんがな!!ヽ( `д´)ノ
よろしければ、一知識として覚えておいてくださいまし…