piapia123
ja

PHP シリアライズ / アンシリアライズ

エンコード

処理はすべてブラウザ内で完結します。データは送信されません

入力
ファイルをここにドロップすると読み込めます
出力

3 つの方向があります。アンシリアライズ(`a:2:{s:4:"name";s:3:"Bob";}` のようなデータを JSON、またはそのままコードに貼れる PHP 配列リテラルに変換)、シリアライズ(JSON を PHP が `unserialize()` できる文字列に変換)、セッションデータ(PHP のセッションファイルは 1 つのシリアライズ値ではなく、`名前|シリアライズ値` を連結したものなので専用の読み取りが必要)。最も間違えやすいのは文字列長がバイト単位である点です。`s:9:"さくら"` が正しく、3 文字でそれぞれ 3 バイトです。文字数で読む実装は ASCII では完璧に動き、日本語に当たった瞬間に文字列の途中で切れて、原因から遠く離れた位置のエラーを出します。ここではコードポイント単位で進みバイト数で数えるため、UTF-16 で 2 コードユニットを占める絵文字でもずれません。

機能

  • 3 つの方向:アンシリアライズ、シリアライズ、セッションデータの解析
  • アンシリアライズの出力は JSON または PHP 配列リテラル(後者はコードにそのまま貼れる)
  • 文字列長をバイト単位で読むため、日本語や絵文字でも位置がずれない
  • PHP 配列はキーが 0 から連続しているかで JSON 配列かオブジェクトかに変換(json_encode() と同じ挙動)
  • オブジェクトのプロパティは復元し、クラス名は JSON に混入させない(JSON に置き場所が無いため)
  • セッションデータは `名前|シリアライズ値` で分割。読めない値は文字列にフォールバックし、全体を失敗させない
  • 最後のセミコロンで切れたセッションファイルも読める
  • シリアライズ方向もバイト数で長さを出すため、日本語データを PHP の unserialize() に戻せる
  • 末尾の余分な空白やセミコロンは許容(データベースやログから取った値には付き物です)
  • ネストが 64 段を超えたら停止し、コールスタックを壊さない
  • 処理はすべてブラウザ内で完結し、データは送信されません

使い方

  1. 方向を選ぶ
  2. シリアライズ文字列・JSON・セッションファイルの内容を貼り付ける
  3. アンシリアライズでは出力形式も選ぶ:JSON はそのまま利用、PHP 配列リテラルはコードに貼り付け

よくある質問

文字列長が文字数ではなくバイト数なのはなぜですか?
PHP の形式がそう定めているからです。`s:` の後ろの数字はバイト数で、`s:6:"你好"` が正しいのは 2 文字がそれぞれ 3 バイトだからです。`s:2:"你好"` と書けば PHP 自身の unserialize() も失敗します。文字数で数えるツールは多くありますが、ASCII では完璧に動き、日本語が出た瞬間に形式エラーになります —— しかも示される位置は原因から遠く、たいてい「データが壊れている」と誤診されます。
PHP 配列が JSON 配列になったりオブジェクトになったりするのはなぜですか?
PHP の配列は 1 種類で、リストも辞書も兼ねますが、JSON はそれを 2 つに分けているからです。ここでの規則は「キーが 0 から連続した整数なら JSON 配列、そうでなければオブジェクト」で、これは PHP 自身の json_encode() と同じです。つまり unserialize してから json_encode した結果と一致します。キーが 1,2,3 の場合や文字列キーの場合はオブジェクトになり、数値キーも JSON の仕様どおり文字列キーとして書かれます。
オブジェクトのクラス名はどこへ行ったのですか?
JSON には入りません。JSON にクラス名を置く場所が無く、`__class` のようなキーを勝手に足すと存在しないデータを捏造することになり、下流がその架空のフィールドを本物として扱ってしまいます。プロパティ自体は完全に保持されます。クラス名が必要なら PHP 出力を使うか、生の値を見てください。なお参照型(`R:` / `r:`)は意図的に対応していません —— これは「その項目が前の項目と同じメモリ」という意味で、独立した 2 つのデータに展開すると見た目は正しく意味が変わるため、エラーにする方を選んでいます。
アンシリアライズしたデータを PHP の unserialize() に戻すのは安全ですか?
データの出所によります。 PHP の unserialize() はオブジェクトを復元する際に `__wakeup()` と `__destruct()` を呼ぶため、攻撃者はコード実行につながるペイロードを仕込めます —— いわゆる PHP オブジェクトインジェクションです。このツール自体はテキストを JSON に解析するだけで何も実行しませんが、出所不明のシリアライズデータを自分の PHP コードに戻すなら、危険はその工程にあります。キャッシュや自作キューのメッセージは問題ありません。ユーザー投稿や他人から転送された文字列は、まず出所を確認してください。
セッションデータに対応しているのはなぜですか?
PHP のセッションファイルは 1 つのシリアライズ値ではなく、`名前|値` を連結したものなので、専用の読み取りが必要だからです。既定の `php` シリアライズハンドラとして読みます。プロジェクトが `php_binary` や `php_serialize` を使っている場合、形が異なりますが、読めない値は全体を失敗させず文字列としてそのまま残すので、少なくともどのキーがあるかは分かります。
データは送信されますか?
いいえ。解析と生成はすべてブラウザのメモリ上で行われ、ページは一切リクエストを送りません。オフラインでも動作します。シリアライズデータには利用者情報やセッション内容が含まれることが多くありますが、それらが端末の外に出ることはありません。

関連ツール