unserialize
保存用表現から PHP の値を生成する
説明
mixed unserialize(string $data
, array $options
= [])
unserialize は、シリアル化された変数を
PHP の値に戻す変換(アンシリアライズ)を行います。
警告
allowed_classes
の options
の値にかかわらず、
ユーザーからの入力をそのまま unserialize に渡してはいけません。
アンシリアライズの時には、オブジェクトのインスタンス生成やオートローディングなどで
コードが実行されることがあり、悪意のあるユーザーがこれを悪用するかもしれないからです。
シリアル化したデータをユーザーに渡す必要がある場合は、安全で標準的なデータ交換フォーマットである
JSON などを使うようにしましょう。
json_decode および json_encode
を利用します。
外部に保存されているシリアル化されたデータをアンシリアライズする必要がある場合は、
hash_hmac を使ったデータの検証を検討しましょう。
他者によるデータの改ざんがないことを確かめるためです。
パラメータ
-
data
-
シリアル化された文字列。
もしアンシリアライズする変数がオブジェクトの場合、
オブジェクトが無事再作成された後、PHP は自動的にメンバ関数
__unserialize() または __wakeup()
(存在していれば) をコールしようとします。
注意:
unserialize_callback_func ディレクティブ
unserialize_callback_func
ディレクティブで指定したコールバックは、未定義のクラスをアンシリアライズしようとした場合にコールされます。
コールバックが指定されない場合は、__PHP_Incomplete_Class
がインスタンス化されます。
-
options
-
unserialize に連想配列で渡すオプション。
有効なオプション
名前 |
型 |
説明 |
allowed_classes |
mixed |
受け付けるクラス名の配列を指定します。あらゆるクラスを拒否する場合は
false 、あらゆるクラスを受け付ける場合は true を指定します。
このオプションを指定しているときに、もし
unserialize が受け付け対象外のクラスのオブジェクトに遭遇すると、
そのオブジェクトを
__PHP_Incomplete_Class のインスタンスに変換します。
このオプションを省略すると、true を指定したのと同じ意味になります。
つまり、PHP はあらゆるクラスのオブジェクトをインスタンス化しようとします。
|
max_depth |
int |
アンシリアライズ処理の間に許される、
データ構造の再帰の深さの最大値を設定します。
これは、スタックオーバーフローを防ぐためのものです。
デフォルトの深さの最大値は 4096 であり、
0 に設定すると、
この制限を無効にすることができます。
|
戻り値
変換された値が返されます。その値は、
bool, int, float,
string, array, object
のいずれかとなります。
渡された文字列が復元できなかった場合、false
を返して
E_WARNING
を発生します。
エラー / 例外
オブジェクトは、
アンシリアライズを実行するハンドラで Throwable をスローしても構いません。
例
例1 unserialize の例
<?php
// ここで、データベースから $session_data にセッションデータをロード
// するために unserialize() を使用します。
// この例は、serialize() で記述された例を補足するものです。
$conn = odbc_connect("webdb", "php", "chicken");
$stmt = odbc_prepare($conn, "SELECT data FROM sessions WHERE id = ?");
$sqldata = array($_SERVER['PHP_AUTH_USER']);
if (!odbc_execute($stmt, $sqldata) || !odbc_fetch_into($stmt, $tmp)) {
// 実行または取得が失敗した場合、空の配列で初期化します
$session_data = array();
} else {
// tmp[0] にシリアル化されたデータを保持している必要があります。
$session_data = unserialize($tmp[0]);
if (!is_array($session_data)) {
// 何か問題があったため、空の配列で初期化します。
$session_data = array();
}
}
?>
例2 unserialize_callback_func の例
<?php
$serialized_object='O:1:"a":1:{s:5:"value";s:3:"100";}';
ini_set('unserialize_callback_func', 'mycallback'); // 独自のコールバック関数を設定する
function mycallback($classname)
{
// クラスが定義されているファイルをインクルードするだけです。
// どのクラス定義が必要になるのかを $classname で判断します。
}
?>
注意
警告
エラーやシリアライズされた false
値をアンシリアライズする場合、
false
が返されます。この特殊なケースは
data
を serialize(false)
で比較する、もしくは E_NOTICE
をキャッチすることで区別することができます。