• JDK动态代理在反序列化中的应用


    简介

    代理是一种设计模式,不修改原有的类,增加一些功能,例如记录日志等。
    静态代理:被代理的类有几个方法,代理类就得实现几个方法,而且代理类新增的功能可能都是一致的,要在这些方法里面重复写。
    动态代理:少量的代码,适配性更强。不需要实现被代理类的所有接口,可以动态获取。不管外部掉什么方法都会执行动态代理的invoke方法。

    动态代理在反序列化中的作用

    1. readObject在反序列化时会自动执行,动态代理的invoke在函数调用的时候也是会自动执行。在漏洞利用的时候,找不到明显的显式调用,那么就可以使用这种隐式调用。
    2. 可以拼接两条链,不管前面执行任意的方法,后面都会走到固定的地方。
    3. 在CC第一条链和jdk7u21那两条链使用了动态代理。

    代码示例

    package com.duziteng.springbootdemo.test.proxy;
    
    import java.lang.reflect.Proxy;
    
    public class Test {
        public static void main(String[] args) {
            IUser user = new IUserImpl();
            //静态代理,可以直接使用IUserImpl的show方法,但是通过IUserProxy代理方式进行调用,顺便加一些记录日志等操作。
            //缺点:被代理的类有几个方法,代理类就得实现几个方法,而且代理类新增的功能可能都是一致的,要在这些方法里面重复写。
    //        IUserProxy userProxy = new IUserProxy(user);
    //        userProxy.show();
    
            //动态代理,少量的代码,适配性更强。不需要实现被代理类的所有接口,可以动态获取
            IUser userProxy = (IUser) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{IUser.class}, new UserInvocationHandler(user));//classLoad、要代理的接口、要做的事情
            userProxy.update();
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    92.(cesium之家)cesium楼栋分层
    elementui表格el-table最右侧操作列展示不完全
    订水商城实战教程09-跑马灯
    java毕业设计哈尔滨文旅信息网站(附源码、数据库)
    C++启航跟沸羊羊有关系吗?
    【Google】“共码未来“—2022谷歌开发者大会参会记录
    L1-002 打印沙漏
    有关微信小程序如何使用mathjs
    Kafka 分区
    宝塔一键安装wordpress
  • 原文地址:https://blog.csdn.net/weixin_42974824/article/details/126328809