序列化漏洞(如 Java 反序列化、PHP unserialize、Python pickle 等)本质上是不可信数据被当作“可执行结构”处理。避免这类漏洞的核心原则是:不要对不可信数据进行反序列化,或让反序列化过程不可执行任意代码。
下面按“通用原则 + 语言实践”来说明。
✅ 推荐:
用 JSON 表达数据,而不是用语言原生序列化表达对象
即使必须反序列化:
readObject、__wakeup、__destruct)❌ 危险:
Object obj = new ObjectInputStream(input).readObject();
✅ 正确做法:
ObjectInputFilter filter = info -> {
if (info.serialClass() != null &&
info.serialClass().getName().equals("com.x.SafeClass"))
return ObjectInputFilter.Status.ALLOWED;
return ObjectInputFilter.Status.REJECTED;
};
enableDefaultTyping)❌ 危险:
unserialize($_COOKIE['data']);
✅ 正确做法:
json_decodeunserialize:
__wakeup / __destruct 中的危险逻辑❌ 危险:
pickle.loads(user_data)
✅ 正确做法:
json.loadsBinaryFormatter(已官方废弃)System.Text.JsonNewtonsoft.Json(关闭 TypeNameHandling)永远不要相信“能变成对象的字节流”。能 JSON 就别序列化,能白名单就别全量恢复,能不执行就不执行。
如果你有具体语言或框架(如 Spring、Dubbo、Fastjson),我可以给更针对性的方案和代码示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。