`
flex2java
  • 浏览: 16980 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hessian/Java反序列化采用自定义的Classloader

    博客分类:
  • java
阅读更多
Hessian/Java反序列化采用自定义的Classloader
对于采用OSGi来做系统的人而言,ClassLoader的问题必然是头号需要解决的问题,如果又是个需要远程通讯的OSGi应用的话,那么反序列化的classloader问题几乎可以肯定是会碰到的,来看看在如今流行的两种序列化、反序列化协议:java/hessian中如何使用自定义的classloader。
java/hessian并不提供直接的传入ClassLoader类来改变反序列化时采用的ClassLoader,hessian采用的为使用当前线程的上下文ClassLoader来加载反序列化的类,java则采用堆栈上最近的一个ClassLoader类来加载,可以认为就是调用类所在的ClassLoader来加载,但在OSGi应用中,通常采用以上默认的行为来反序列化加载类是会出问题的,因此需要采用自定义的。
先来看看java的,Java在ObjectInputStream.readObject时最后采用的是resolveClass方法来加载类:
protected Class<?> resolveClass(ObjectStreamClass desc)
    throws IOException, ClassNotFoundException
    {
    String name = desc.getName();
    try {
        return Class.forName(name, false, latestUserDefinedLoader());
    } catch (ClassNotFoundException ex) {
        Class cl = (Class) primClasses.get(name);
        if (cl != null) {
        return cl;
        } else {
        throw ex;
        }
    }
    }惊喜的是,resolveClass是protected的,:),还好,还留下了这一手,于是毫不客气,写一个继承ObjectInputStream的子类,然后覆盖resolveClass方法即可,到这步了就可以随意用自己的ClassLoader来实现加载了。
OK,java的解决了,来看Hessian的,Hessian在加载类的时候采用了下面的代码:
if (type.startsWith("[")) {
      Deserializer subDeserializer = getDeserializer(type.substring(1));
      deserializer = new ArrayDeserializer(subDeserializer);
    }
    else {
      try {
    ClassLoader loader = Thread.currentThread().getContextClassLoader();
     
    Class cl = Class.forName(type, false, loader);

    deserializer = getDeserializer(cl);
      } catch (Exception e) {
      }
    }看过这段代码后,就明白,要替换,最明显的一种做法是替换当前线程的上下文classloader,而这通常有一定的风险,因为可能会有很多代码使用到线程的上下文classloader,另外一种可选的做法就是继承SerializerFactory,覆盖其中的getDeserializer方法,从而实现对加载类的ClassLoader的控制,这种方式风险就比较小了。
为了能实现使用自定义的classloader后可以加载到所有bundle export package中的类,在自定义classloader所在的Bundle中需要加上DynamicImport-Package,这样可以比较简单的实现。
在Equinox中,则还可以选择实现ClassLoadingHook,这样可以比较简单的实现和其他外部容器的集成以及更加自如的控制classloader,:)
在解决了classloader的问题后,通常来讲,使用OSGi带给你的更多的就是享受,而非痛苦了。
分享到:
评论

相关推荐

    hessian学习基础篇——序列化和反序列化

    Hessian反序列化过程接收二进制流,并根据其定义解析成Java对象。这个过程对于跨语言通信特别有用,因为它能将一个语言的对象转换为另一种语言可以理解的格式。 在实际应用中,Hessian常用于构建轻量级的Web服务,...

    S25-hessian反序列化1

    【S25-Hessian反序列化1】是一个关于Java中Hessian序列化库的讨论,主要涉及Hessian与原生Java序列化的差异以及在Spring框架中的应用。Hessian是一种二进制序列化协议,旨在提高远程过程调用(RPC)的效率。与原生Java...

    Hessian 的字段序列化小记

    在序列化过程中,Hessian会将Java对象转换为字节流,反序列化时则将字节流恢复为原始对象。 1. **Hessian序列化流程** - 首先,Hessian序列化器会遍历Java对象的所有字段,对每个字段进行处理。 - 对于基本类型,...

    Nacos JRaft Hessian 反序列化 RCE 分析.pdf

    ### Nacos JRaft Hessian 反序列化 RCE 分析 #### 一、背景介绍 Nacos 是阿里巴巴开源的一款易于构建云原生应用的动态服务发现、配置管理和服务管理平台。JRafT 是 SOFAStack 微服务平台中的一个分布式一致性组件...

    java 反序列化利用工具marshalsec-0.0.3-SNAPSHOT-all

    -a:生成exploit下的所有payload(例如:hessian下的SpringPartiallyComparableAdvisorHolder, SpringAbstractBeanFactoryPointcutAdvisor, Rome, XBean, Resin) -t:对生成的payloads进行解码测试 -v:verbose mode...

    基于混合分析的Java反序列化利用链挖掘方法.docx

    根据反序列化机制的不同,Java反序列化器可以大致分为两类:基于bean的反序列化器(如Fastjson和Jackson,通过调用setter方法设置属性值)和基于field的反序列化器(如JND、XStream、Hessian,通过反射直接对属性...

    hessian序列化规范

    3. 自定义Hessian序列化器以支持自定义类型的序列化和反序列化。 总结,Hessian序列化规范是分布式系统中的重要工具,理解其原理和使用方法,能够帮助我们构建高效、可靠的跨网络通信方案。然而,任何工具都有其...

    Spring中集成Hessian的问题

    Hessian服务端的序列化和反序列化过程、HTTP请求处理以及异常处理等都是关键部分。而Spring框架如何与Hessian进行集成,包括服务注册、请求处理和代理创建等,也值得研究。 **工具支持** 为了方便调试和测试,可以...

    hessian java +c# 数据测试

    在Java端定义的类可以通过Hessian的`Hessian2Output`进行序列化,C#端的类则需要通过HessianNet的解码器来反序列化。 至于"List"和"Map",它们在Hessian中也有特别的处理方式。Hessian可以序列化和反序列化List和...

    浅谈Java序列化和hessian序列化的差异

    Java序列化和Hessian序列化的差异 Java序列化和Hessian序列化是两种常用的序列化机制,它们都可以将对象转换为字节流,以便在网络上传输。但是,两者之间有着很大的差异,今天我们就来比较一下它们的实现机制和特点...

    removal RCE、Hessian 反序列化、Yaml反序列化、密码解密、部分常用敏感路径(漏洞更新截止2024.9.12)

    removal RCE、Hessian 反序列化、Yaml反序列化、密码解密、部分常用敏感路径(漏洞更新截止2024.9.12)

    基于java序列化的Netty编解码技术

    **序列化安全性**:由于序列化可以将对象状态暴露出去,可能包含敏感信息,因此,对于包含敏感数据的对象,应实现`java.io.Serializable`接口,并覆盖`writeObject()`和`readObject()`方法,自定义序列化和反序列化...

    java+hessian 远程调用

    - **支持基本类型和复杂对象**:不仅可以处理基本数据类型,还可以序列化和反序列化Java对象,包括集合和自定义类。 4. **使用说明文档**: - **配置详解**:文档通常会包含如何配置Hessian服务端和客户端的详细...

    hessian小例(java)

    2. 通过代理调用服务端的方法,Hessian会自动处理网络通信和反序列化结果。 使用Apache Commons Hessian库,我们可以很容易地创建Hessian代理,如下所示: ```java HessianProxyFactory factory = new ...

    java 使用hessian进行两台服务器资源之间同步实例

    它将Java对象自动转换为二进制格式,减少了网络传输的数据量,同时提供了对基本数据类型和复杂对象的高效序列化和反序列化支持。 要实现两台服务器间的资源同步,首先你需要在服务提供者(Server A)上创建一个可被...

    Hessian 2.0序列化协议规范.docx

    在分布式计算和网络通信中,数据的序列化和反序列化是至关重要的环节。Hessian 2.0是一种高效的二进制序列化协议,它旨在减少网络传输的数据量,提高数据交换的效率。本文将详细介绍Hessian 2.0的序列化规范,包括其...

    dubbo-exp:Dubbo反序列化一键快速攻击测试工具,支持dubbo协议和http协议,支持hessian反序列化和java原生反序列化

    a --args gadget入参,多个参数使用多次该命令传入,例-a -a Calc-p --protocol [dubbo|http] 通讯协议名称,默认缺省dubbo-s --serialization [hessian|java] 序列化类型,默认缺省hessian-t --target 目标,例:...

    Java 序列化的秘密(高清PDF中文版)

    除了使用Java标准库提供的序列化机制外,开发者还可以通过实现`Externalizable`接口来自定义序列化和反序列化逻辑。这种方式提供了更高的灵活性,允许开发者控制对象的状态如何被序列化和反序列化。 #### 严重漏洞...

Global site tag (gtag.js) - Google Analytics