温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何避免序列化漏洞

发布时间:2026-10-25 16:27:22 来源:亿速云 阅读:93 作者:小樊 栏目:编程语言

序列化漏洞(如 Java 反序列化、PHP unserialize、Python pickle 等)本质上是不可信数据被当作“可执行结构”处理。避免这类漏洞的核心原则是:不要对不可信数据进行反序列化,或让反序列化过程不可执行任意代码。

下面按“通用原则 + 语言实践”来说明。


一、通用原则(最重要)

1. 不要反序列化不可信数据

  • 来自:用户输入、HTTP 请求、Cookie、文件上传、消息队列、RPC 参数
  • 如果必须传数据,用安全的数据格式:
    • JSON
    • XML(需禁用外部实体)
    • Protocol Buffers / FlatBuffers

✅ 推荐:

用 JSON 表达数据,而不是用语言原生序列化表达对象


2. 白名单控制反序列化类型

即使必须反序列化:

  • 只允许明确可信的类
  • 禁止动态加载未知类

3. 最小化反序列化能力

  • 禁用:
    • 自动执行(readObject、__wakeup、__destruct)
    • 动态代理
    • 反射调用
  • 使用“只读取数据,不重建对象”的解析方式

4. 输入校验 + 签名

  • 对序列化数据:
    • 加 MAC / 数字签名
    • 验证来源和完整性
  • 防止篡改和伪造

二、分语言实践

Java(高危:反序列化漏洞重灾区)

❌ 危险:

Object obj = new ObjectInputStream(input).readObject();

✅ 正确做法:

  1. 使用 Serialization Filter(JEP 290)
ObjectInputFilter filter = info -> {
    if (info.serialClass() != null &&
        info.serialClass().getName().equals("com.x.SafeClass"))
        return ObjectInputFilter.Status.ALLOWED;
    return ObjectInputFilter.Status.REJECTED;
};
  1. 用安全替代方案:
  • Jackson(关闭 enableDefaultTyping)
  • Gson
  • Protobuf
  1. 禁止:
  • Apache Commons Collections(老版本)
  • 动态代理反序列化

PHP

❌ 危险:

unserialize($_COOKIE['data']);

✅ 正确做法:

  • 用 json_decode
  • 若必须用 unserialize:
    • 不允许用户控制数据
    • 避免 __wakeup / __destruct 中的危险逻辑

Python

❌ 危险:

pickle.loads(user_data)

✅ 正确做法:

  • 用 json.loads
  • 若必须用 pickle:
    • 仅限可信内部服务
    • 不暴露在网络边界

.NET

  • 避免:
    • BinaryFormatter(已官方废弃)
  • 使用:
    • System.Text.Json
    • Newtonsoft.Json(关闭 TypeNameHandling)

三、架构层面的防护

  • 服务间通信:
    • 使用 schema 校验(Protobuf / Avro)
  • 安全边界:
    • 反序列化只在可信内部完成
  • 安全测试:
    • 静态扫描(反序列化点)
    • 模糊测试(fuzzing)

四、一句话总结

永远不要相信“能变成对象的字节流”。能 JSON 就别序列化,能白名单就别全量恢复,能不执行就不执行。

如果你有具体语言或框架(如 Spring、Dubbo、Fastjson),我可以给更针对性的方案和代码示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手