温馨提示×

温馨提示×

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

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

序列化漏洞怎么防

发布时间:2026-10-05 04:06:29 来源:亿速云 阅读:93 作者:小樊 栏目:编程语言

序列化漏洞(Insecure Deserialization)通常指程序在反序列化不可信数据时,攻击者可构造恶意对象,导致远程代码执行(RCE)、权限提升、拒绝服务等。下面从原理 → 防护措施 → 常见语言实践系统讲一下。


一、核心防护原则

不要反序列化不可信来源的数据

这是最根本的一条。


二、通用防护手段

1. 避免反序列化不可信数据(最推荐)

  • 不要使用原生序列化(如 Java 原生、PHP unserialize、Python pickle)传输或存储外部数据
  • 改用安全的数据格式:
    • JSON
    • XML(配合严格 schema)
    • Protocol Buffers / MessagePack(非语言原生对象)

✅ JSON ≠ 自动安全,但不会直接还原对象


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

只允许指定类型被反序列化:

  • Java:ObjectInputFilter(JDK 9+)
  • PHP:allowed_classes 参数
  • .NET:自定义 SerializationBinder

❌ 不要使用“允许所有类”


3. 签名 + 加密(防篡改)

对序列化数据:

  • 签名(HMAC):防止被篡改
  • 加密:防止被查看/伪造
data = encrypt( serialize(obj) )
token = HMAC(data, secret)

校验失败直接拒绝。


4. 禁用危险功能

  • 禁用:
    • readObject 自定义危险逻辑
    • 反射调用
    • 动态类加载
  • 移除或限制:
    • Java:CommonsCollections、Fastjson 老版本
    • PHP:__wakeup、__destruct

5. 输入来源控制

  • 不反序列化:
    • Cookie
    • 请求参数
    • 外部 API 返回值(除非可信 + 签名)
  • 内部服务通信也要鉴权

三、分语言实践

Java

ObjectInputFilter filter = 
    ObjectInputFilter.Config.createFilter("com.xxx.SafeClass;!*");
ObjectInputStream ois = new ObjectInputStream(in);
ois.setObjectInputFilter(filter);

✅ 使用 JSON(Jackson / Gson)代替原生序列化
❌ 避免 Fastjson 早期版本


PHP

$data = unserialize($str, [
    "allowed_classes" => ["User"]
]);

❌ 不要:

unserialize($_COOKIE['data']);

Python

❌ 不要:

pickle.loads(data)

✅ 用:

json.loads(data)

.NET

  • 使用 BinaryFormatter ❌(已不推荐)
  • 使用 System.Text.Json ✅
  • 自定义 SerializationBinder 限制类型

四、检测与防御补充

  • 使用 SAST / DAST 扫描反序列化点
  • WAF 规则(辅助,不是根本)
  • 最小权限运行服务(即使被 RCE 也受限)

五、一句话总结

防序列化漏洞 = 不反序列化不可信数据 + 白名单 + 签名 + 不用危险库

如果你愿意,可以告诉我你用的是 Java / PHP / Python / .NET,我可以直接给你可落地的代码级防护方案。

向AI问一下细节

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

AI
助
手