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 层时停止,而不是把调用栈打穿
- 全部在浏览器本地完成,数据不外传
使用方法
- 选方向
- 把序列化字符串、JSON 或会话文件内容粘进输入框
- 反序列化时再选产物形态: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`,内容形状不同,读不通的值会原样保留成字符串(而不是整份报错),至少能让看到里面有哪些键。
- 数据会被上传吗?
- 不会。解析与生成全在浏览器内存里完成,页面不发送任何请求,断网也能用 —— 序列化数据里常常带着用户信息与会话内容,它们不会离开这台设备。
相关工具
Base64 编解码
编码把文本转成 Base64,或把 Base64 还原成文本,中文与 emoji 都按 UTF-8 正确处理。全部在浏览器本地完成,内容不上传。
JSON 格式化
格式化在线 JSON 格式化与校验工具:树形折叠浏览、搜索键值、逐节点改值与删除、语法错误定位到具体行列,输入框带行号与高亮。全部在浏览器本地完成。
URL 编解码
编码把中文、空格与符号转义成 %XX,或把 %XX 还原成文本;整条 URL 与单独的参数值要选对方式,选错不会报错,但链接会打不开。全部在浏览器本地完成。
JS 解包
编码解开 eval(function(p,a,c,k,e,d){…}) 这类压缩代码,也能反向打包。纯字符串处理,不执行任何脚本。
HTML 实体编解码
编码把 < > & 与引号转成 HTML 实体,也能把实体还原成字符,而且只解一遍:&lt; 得到的是 < 而不是尖括号。全部在浏览器本地完成。
JWT 解析与验签
编码把 JWT 拆成 header、payload、signature,支持用密钥验证 HS256/384/512 签名,并把 exp、nbf 换算成可读时间。全部在浏览器本地完成。