手动修改序列化权限字符串引发PHP unserialize偏移错误的排查
问题排查与解决方案
错误原因
手动修改序列化权限字符串后出现反序列化错误,核心原因有两点:
- 数组长度不匹配:原超级管理员的序列化字符串开头是
a:32:,代表数组包含32个元素。添加新权限后未将32改为33,反序列化时解析器发现实际元素数量与声明长度不符,直接触发报错。 - 索引冲突与顺序混乱:你手动插入
i:0;s:8:"viewFile";,覆盖了原数组索引0对应的createUser权限,同时导致后续所有索引的对应关系全部错位,解析器无法正确识别每个元素的位置。
正确修改方式
方法一:通过代码生成合法序列化字符串(推荐)
手动修改序列化字符串极易出错,最稳妥的方式是借助PHP代码完成权限修改和重新序列化:
// 复制原超级管理员的序列化字符串 $original_serialized = 'a:32:{i:0;s:10:"createUser";i:1;s:10:"updateUser";i:2;s:8:"viewUser";i:3;s:10:"deleteUser";i:4;s:11:"createGroup";i:5;s:11:"updateGroup";i:6;s:9:"viewGroup";i:7;s:11:"deleteGroup";i:8;s:11:"createStore";i:9;s:11:"updateStore";i:10;s:9:"viewStore";i:11;s:11:"deleteStore";i:12;s:11:"createTable";i:13;s:11:"updateTable";i:14;s:9:"viewTable";i:15;s:11:"deleteTable";i:16;s:14:"createCategory";i:17;s:14:"updateCategory";i:18;s:12:"viewCategory";i:19;s:14:"deleteCategory";i:20;s:13:"createProduct";i:21;s:13:"updateProduct";i:22;s:11:"viewProduct";i:23;s:13:"deleteProduct";i:24;s:11:"createOrder";i:25;s:11:"updateOrder";i:26;s:9:"viewOrder";i:27;s:11:"deleteOrder";i:28;s:10:"viewReport";i:29;s:13:"updateCompany";i:30;s:11:"viewProfile";i:31;s:13:"updateSetting";}'; // 反序列化为数组 $permissions = unserialize($original_serialized); // 添加新权限 $permissions[] = 'viewFile'; // 重新序列化 $new_serialized = serialize($permissions); // 输出结果,复制到数据库中替换原字段值 echo $new_serialized;
将上述代码在本地PHP环境运行,把输出的字符串复制到phpMyAdmin中替换超级管理员的permission字段即可,代码会自动处理数组长度、索引和格式问题。
方法二:手动修正序列化字符串(不推荐)
如果一定要手动修改,需严格遵循以下步骤:
- 将字符串开头的
a:32:改为a:33:(表示数组元素数量变为33) - 在字符串末尾的
}前添加,i:32;s:8:"viewFile";(索引32是原最大索引31的下一位,确保索引连续) - 确保所有引号转义格式与原字符串一致(phpMyAdmin中显示的
"对应实际的双引号,不要随意修改)
内容的提问来源于stack exchange,提问作者wloleo
相关产品推荐
相关产品推荐

