piapia123
zh

PHP 序列化 / 反序列化

编码

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

三个方向:反序列化(把 `a:2:{s:4:"name";s:3:"Bob";}` 这样的数据还原成 JSON,或还原成可以直接粘进代码的 PHP 数组字面量)、序列化(把 JSON 变成 PHP 能 `unserialize()` 的字符串)、session 数据(PHP 的会话文件不是「一串序列化数据」,而是 `名字|序列化值` 重复拼起来的,需要单独拆)。最容易出错的地方是字符串长度按字节算:`s:6:"你好"` 才是对的,两个汉字各 3 字节 —— 按字符数读的实现全在纯 ASCII 数据上正常,一遇到中文就从字符串中间断开,然后报一个和真正原因无关的错。这里的读取器按码点推进、按字节计数,emoji 这类在 UTF-16 里占两个码元的字符也不会错位。

功能

  • 三个方向:反序列化、序列化、session 数据解析
  • 反序列化产物可选 JSON 或 PHP 数组字面量(后者能直接粘进 PHP 代码)
  • 字符串长度按字节读取,中文、日文、emoji 都不会错位
  • PHP 数组按「键是否从 0 连续」还原成 JSON 数组或对象,与 json_encode() 的行为一致
  • 对象的属性被还原,类名不会混进 JSON(JSON 里没有它的位置)
  • session 数据按 `名字|序列化值` 拆开;读不通的值退回字符串,而不是整份失败
  • 会话文件被截断在最后一个值的分号上时也能读出来
  • 序列化方向的字符串长度同样按字节算,中文数据粘回 PHP 就能 unserialize
  • 尾部多余的空白与分号放过,从数据库或日志里抠出来的值常常带着它们
  • 嵌套超过 64 层时停止,而不是把调用栈打穿
  • 全部在浏览器本地完成,数据不外传

使用方法

  1. 选方向
  2. 把序列化字符串、JSON 或会话文件内容粘进输入框
  3. 反序列化时再选产物形态:JSON 拿去用,PHP 数组字面量拿去粘进代码

常见问题

为什么字符串长度是字节数而不是字符数?
这是 PHP 自己的格式规定:`s:` 后面的数字是字节数。`s:6:"你好"` 是对的,因为两个汉字各占 3 字节;写成 `s:2:"你好"` 的话,PHP 自己也会 unserialize 失败。很多在线工具按字符数读,于是纯 ASCII 数据全部正常、一遇到中文就报格式错误 —— 而报错位置离真正的原因很远,最容易被误判成「数据损坏了」。
PHP 数组为什么有时变成 JSON 数组、有时变成对象?
因为 PHP 只有一种数组,既当列表又当字典用,而 JSON 把这两种分成了两样东西。这里的还原规则是:键是从 0 开始连续的整数就当 JSON 数组,否则当对象 —— 这正是 PHP 自己的 json_encode() 在做的事,所以「先 unserialize 再 json_encode」得到的结果与这里一致。键是 `1,2,3` 或者有字符串键时都会变成对象,包括数字键也会写成字符串键(JSON 的规定)。
对象的类名去哪了?
没有出现在 JSON 里 —— JSON 没有能放类名的地方,硬塞一个 `__class` 之类的键会凭空造出数据,让下游把本不存在的字段当成真的。属性本身完整保留,需要类名请用 PHP 输出形态或直接看原始数据。另外引用类型(`R:` / `r:`)明确不支持:它表达的是「这一项与前面某项是同一块内存」,展开成两份独立数据是看着对、实际改了语义,所以这里宁可报错。
把反序列化出来的数据再粘回 PHP 的 unserialize() 安全吗?
取决于数据来自哪里。 PHP 的 unserialize() 在还原对象时会触发 `__wakeup()` 与 `__destruct()`,攻击者可以借此构造出能执行代码的 payload —— 这就是「PHP 对象注入」。这个工具本身只是把文本解析成 JSON,不执行任何东西;但如果你把来源不明的序列化数据粘回自己的 PHP 代码里还原,风险就在那一步。库里的缓存、自己写的队列消息没问题;用户提交的、或者别人发来的串要先想清楚来源。
session 数据为什么能解析?
PHP 的会话文件不是「一串序列化数据」,而是 `名字|序列化值` 一条接一条拼起来的,所以需要单独拆。工具按默认的 `php` 序列化处理器来读;如果你的项目用的是 `php_binary` 或 `php_serialize`,内容形状不同,读不通的值会原样保留成字符串(而不是整份报错),至少能让看到里面有哪些键。
数据会被上传吗?
不会。解析与生成全在浏览器内存里完成,页面不发送任何请求,断网也能用 —— 序列化数据里常常带着用户信息与会话内容,它们不会离开这台设备。

相关工具