安全开发Java动态代理
关于安全开发的一些思考
之前面试某宝的时候,某人问过我,如果解决开发不懂安全的问题,就比如说SSRF,XEE这样的漏洞,如果一旦发生,应该如果立刻去响应,并帮助开发人员修复漏洞,难道写一个jar包?然后丢给数以百计的业务去调用?还是你去手把手的去教给开发,应该如何修改代码!!
其实在java动态代理中,就已经解决了这种问题,本人将从以下几个方面,帮助大家理解动态代理的知识。对于懂java的“安全牛”来说这是一件很简单的事情,本文目的主要是记录下解决问题的过程。
静态代理
jdk动态代理
CGLIB代理
Spring AOP

为什么使用动态代理
作为在乙方工作的“安全工程狮”有时候想一下还是幸福的,最近通过跟甲方的某狮子交流,发现业务量很大的情况下,一旦发生了安全问题,解决起来真是个麻烦的事情,需要收集资产,要出方案,最难的是教会开发修补漏洞,仔细思考了这个问题,遂想到了java动态代理,周末的时候研究了一下,现在分享给大家。设想一下,如果你挨个去教给开发应该怎么去修复漏洞,那么24小时之内完成应急是根本不可能完成的。比较高效的方法是,安全的逻辑都由安全部门实现,我们只需要留给开发一个接口供他们去使用就ok。那怎么样才可能通过,不修改源代码的情况下,增加业务的安全性,就是通过今天说的java动态代理。
静态代理
定义接口:
public interface Hello1 {
public void say(String name);
}
复制代码
实现类:
public class HelloImpl implements Hello1{
@Override
public void say(String name) {
// TODO Auto-generated method stub
System.out.println("Hello"+name);
}
}
复制代码
hello1代理类: public class HelloProxy implements Hello1{ private Hello1 hello;
public HelloProxy(){
hello=new HelloImpl();
}
@Override
public void say(String name){
before();
hello.say(name);
after();
}
private void after() {
// TODO Auto-generated method stub
System.out.println("after");
}
private void before() {
// TODO Auto-generated method stub
System.out.println("before");
}
}
复制代码
主函数:
public static void main(String[] args){
Hello1 helloProxy=new HelloProxy();
helloProxy.say("Jack");
}
复制代码
由上面的过程可以看得出来,我们通过hello1的代理类,增加了say()函数,通过代理,实现了before和after函数。这就是我要说的代理,只不过这事静态代理,通用性差,修改起来麻烦。下面说动态代理。
jdk动态代理
public class DynamicProxy2 implements InvocationHandler {
public Object target;
@SuppressWarnings("unchecked")
public <T> T getProxy(){
return (T)Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
public DynamicProxy2(Object target) {
// TODO Auto-generated constructor stub
this.target=target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
before();
Object result=method.invoke(target, args);
after();;
return result;
}
private void after() {
// TODO Auto-generated method stub
System.out.println("after");
}
private void before() {
// TODO Auto-generated method stub
System.out.println("before");
}
复制代码
主函数:
public static void main(String[] args) {
// TODO Auto-generated method stub
DynamicProxy2 dynamicProxy2 = new DynamicProxy2(new HelloImpl());
Hello1 helloproxy= dynamicProxy2.getProxy();
helloproxy.say("hi java");
}
复制代码
这里可以看到通过jdk动态代理,首先实现InvocationHandler接口,然后实现了invoke方法。从主函数中可以看到,这里我们并不关心你的类是什么,你的接口是什么,只要你把实现接口的类传递进来,就可以了,这个方案看起来是很不错的。好像可以解决一开始的需求,但是jdk动态代理只能代理接口,而不能代理没有接口的类,这种情况该怎么解决?
CGLIB动态代理
public class CGLibProxy implements MethodInterceptor {
@SuppressWarnings("unchecked")
public<T> T getProxy(Class<T> cls){
return (T) Enhancer.create(cls, this);
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
// TODO Auto-generated method stub
before();
Object result=proxy.invokeSuper(obj, args);
after();
return result;
}
private void after() {
// TODO Auto-generated method stub
System.out.println("after");
}
private void before() {
// TODO Auto-generated method stub
System.out.println("before");
}}
复制代码
主函数:
public static void main(String[] args) {
// TODO Auto-generated method stub
CGLibProxy cglibproxy=new CGLibProxy();
Hello1 helloproxy=cglibproxy.getProxy(HelloImpl.class);
helloproxy.say("asd");
}
复制代码
这里需要引入开篇时候的那个jar包。CGLIB可以代理没有接口的类,这就弥补了jdk动态代理的不足。通过jdk,cglib动态代理,就可以解决以上遇到的问题。
来自:http://www.freebuf.com/articles/web/118334.html
安全开发Java动态代理的更多相关文章
- [转]java动态代理(JDK和cglib)
转自:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代理 ...
- java高级---->Java动态代理的原理
Java动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程 ...
- Java 动态代理机制分析及扩展
Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...
- [转]Java 动态代理机制分析及扩展
引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...
- 【转载】Java 动态代理
Java 动态代理 本文为 Android 开源项目源码解析 公共技术点中的 动态代理 部分项目地址:Jave Proxy,分析的版本:openjdk 1.6,Demo 地址:Proxy Demo分析 ...
- java动态代理(1)
来源:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html# java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代 ...
- 深入浅出Java动态代理
文章首发于[博客园-陈树义],点击跳转到原文深入浅出Java动态代理 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理 ...
- AOP面向切面编程JAVA动态代理实现用户权限管理(实现篇)
java动态代理机制的功能十分强大,使用动态代理技术能够有效的降低应用中各个对象之间的耦合紧密程度,提高开发的效率以及程序的可维护性,事实上Spring AOP就是建立在Java动态代理的基础之上.其 ...
- Java动态代理 深度详解
代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理模式从类型上来说,可以分为静态代理和动态代理两种类型. 今天我将用非常 ...
随机推荐
- es6 map()和filter()详解【转】
原文地址:http://www.zhangxinxu.com/wordpress/2013/04/es5%e6%96%b0%e5%a2%9e%e6%95%b0%e7%bb%84%e6%96%b9%e6 ...
- Fabric 查看zookeeper和kafka
进入kafka容器: sudo docker exec -it kafka bash cd opt/kafka 查看Kafka自动创建的topic bin/kafka-tipiccs.sh --lis ...
- DC-1靶机
DC-1 靶机获取:http://www.five86.com/ 发现IP:arp-scan --interface=eth0 -localnet arp-scan -l 靶机IP:192.168.0 ...
- centOS 安装 pm2
安装 npm install -g pm2 自启 pm2 startup centos 启动 pm2 start server/add.js (以实际路径为准) 其他命令: pm2 list #查看进 ...
- Goahead 编译
目录 Goahead 目录说明 Ubuntu编译 交叉编译 方便测试 参考 title: Goahead date: 2019/11/6 09:45:01 toc: true --- Goahead ...
- 关于 layer.open 动态赋值不了的问题
前情: layer.open({ type:1, // 用的是默认的信息弹框 content: $('#test'), // 这里不用 $('#test').html(), 不然后面获取不了值 }); ...
- linux日常常用命令分析
日志处理: 测试网络路由: xargs使用方法: tcpdump命令分析: dd 写入磁盘测试 cpu个数: 查看网卡流量 查看端口联通情况,临时加端口 ntpdate同步: 可以取出变动的密码: 导 ...
- 连接池和JDBCTemplate
一:什么是连接池?使用连接池的好处是什么? 连接池就是一个存放数据库连接对象的容器.当系统初始化后,就会向数据库申请一些连接对象存放到容器里,用的时候直接从容器里取,用完后放回连接池. 连接池可以提高 ...
- nssm设置solr开机启动服务
首先,下载nssm http://www.nssm.cc/download 命令 nssm install solr 然后到服务里启动solr,并设置为自动 Ctrl+Shift+Esc(说明:Esc ...
- [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar中的类解压后放在运行jar中
前文: [学习笔记] 在Eclipse中导出可以直接运行的jar,依赖的jar打在jar包中 使用7z打开压缩包,查看所有依赖的jar都被解压以包名及class的方式存储在了运行jar中,此时jar的 ...