Java反序列化基础篇-JDK动态代理

网站建设5年前发布
43 0 0

先说说什么是代理模式,要说代理模式,得从代理说起。下面一张图中的中介,就是我们所说的代理。,20230306120915240d9f64380ab9fc047934de7bec99c0041e88229,简单理解静态代理,想要实现租客找中介租房东,在 Java 中就需要4个文件,分别是房源、房东、中介、租客,其中房源应该是接口,其余三项为类。,不明白房源为什么是接口的师傅,这与 Java 编程的设计思想有关,我个人也喜欢把它与 c++ 里面的纯虚函数做类比。可以移步至狂神的视频学习一下静态代理。,Rent.java,Host.java,因为租客是要去找中介看房的,而不是去找房东看房的,所以我们这里先把 Proxy.java 实现一下,也就是把中介相关的功能先实现一下。,Proxy.java:这是一个类,这个类是中介,也就是代理,他需要有房东的房源,然而我们通常不会继承房东,而会将房东作为一个私有的属性host,我们通过host.rent()来实现租房的方法。,Proxy.java,Client.java租客去找中介看房。,这样子,基本的看房就完成了 ~,20230306120915f230e90007a5eda647f750ec75d9817a3dce33550,改进 Proxy.java,202303061212253574e1a301fee2b0415746a7e6ebf647a58260406,优点:,缺点 :,我们想要静态代理的好处,又不想要静态代理的缺点,所以 , 就有了动态代理 !,深入理解静态代理,深入到实际业务当中,比如我们平常做的最多的 CRUD,我们需要一个真实对象来完成这些增删改查操作。,UserServiceImpl.java,需求来了,现在我们需要增加一个日志功能,怎么实现!,处理手段:增加一个代理类来处理日志。,UserServiceProxy.java,修改启动器 Client.java,如此一来,增加业务点的日志便成功了 。,20230306120915d5dac0699f61e581bdf4299fc5d1839a2d34db835,每多一个房东就需要多一个中介,这显然不符合生活认知(对于租客来说,如果是用静态代理模式,每当想要换一个房东,那就必须要再换一个中介,在开发中,如果有多个中介代码量就更大了),动态代理的出现就是为了解决上面静态代理的缺点。,动态代理的一些基础知识,下面讲的主要是一些源码的东西吧,不看也可。我是不建议看的,但是为了文章内容的完整性,我还是贴上来吧。,JDK的动态代理需要了解两个类,核心 : InvocationHandler 调用处理程序类和 Proxy 代理类,InvocationHandler:调用处理程序,InvocationHandler是由代理实例的调用处理程序实现的接口,每个代理实例都有一个关联的调用处理程序。,当在代理实例上调用方法的时候,方法调用将被编码并分派到其调用处理程序的invoke()方法。,参数:,Proxy : 代理,Proxy提供了创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类。,动态代理类 (以下简称为代理类 )是一个实现在类创建时在运行时指定的接口列表的类,具有如下所述的行为。 代理接口是由代理类实现的接口。 代理实例是代理类的一个实例。,返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。,参数,动态代理的代码实现,①:我们代理的是接口,而不是单个用户。,②:代理类是动态生成的,而非静态定死。,我只能说这种编程思想是真的牛逼,其实我们还可以实现任意接口的动态代理实现,在这里就不贴出来了。,首先是我们的接口类,UserService.java,接着,我们需要用实体类去实现这个抽象类,UserServiceImpl.java,接着,是动态代理的实现类,Client.java,20230306121225f86315a54a37859b5fb8309a9cbe63c7e4975e534,回到之前文章的内容,我们之前说要利用反序列化的漏洞,我们是需要一个入口类的。,我们先假设存在一个能够漏洞利用的类为B.f,比如Runtime.exec这种。,我们将入口类定义为A,我们最理想的情况是 A[O] -> O.f,那么我们将传进去的参数O替换为B即可。但是在实战的情况下这种情况是极少的。,回到实战情况,比如我们的入口类A存在O.abc这个方法,也就是 A[O] -> O.abc;而 O 呢,如果是一个动态代理类,O的invoke方法里存在.f的方法,便可以漏洞利用了,我们还是展示一下。,动态代理在反序列化当中的利用和readObject是异曲同工的。,readObject方法在反序列化当中会被自动执行。,而invoke方法在动态代理当中会自动执行。,20230306120919f3127f386195c0b4b241243f9a6682020d0efc710

© 版权声明

相关文章