关于安全开发的一些思考

  之前面试某宝的时候,某人问过我,如果解决开发不懂安全的问题,就比如说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动态代理的更多相关文章

  1. [转]java动态代理(JDK和cglib)

    转自:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代理 ...

  2. java高级---->Java动态代理的原理

    Java动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程 ...

  3. Java 动态代理机制分析及扩展

    Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...

  4. [转]Java 动态代理机制分析及扩展

    引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...

  5. 【转载】Java 动态代理

    Java 动态代理 本文为 Android 开源项目源码解析 公共技术点中的 动态代理 部分项目地址:Jave Proxy,分析的版本:openjdk 1.6,Demo 地址:Proxy Demo分析 ...

  6. java动态代理(1)

    来源:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html# java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代 ...

  7. 深入浅出Java动态代理

    文章首发于[博客园-陈树义],点击跳转到原文深入浅出Java动态代理 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理 ...

  8. AOP面向切面编程JAVA动态代理实现用户权限管理(实现篇)

    java动态代理机制的功能十分强大,使用动态代理技术能够有效的降低应用中各个对象之间的耦合紧密程度,提高开发的效率以及程序的可维护性,事实上Spring AOP就是建立在Java动态代理的基础之上.其 ...

  9. Java动态代理 深度详解

    代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理模式从类型上来说,可以分为静态代理和动态代理两种类型. 今天我将用非常 ...

随机推荐

  1. 【ML】seq2seq原理

    最近要做分享,重温seq2seq原理,这篇文章讲的挺清楚: https://zhuanlan.zhihu.com/p/40920384 https://www.jianshu.com/p/b2b95f ...

  2. intel 酷睿core系列cpu的类型:U M H HQ MQ

    相对于笔记本来说.一般我们说的intel系列cpu是指应用于desktop桌面版,embedded嵌入式版, mobile移动版 桌面版和移动版cpu对比 http://tieba.baidu.com ...

  3. Flutter之Dio引入和简单的Get/Post请求

    先在pubspec.yaml中引入Dio包如图所示 认识Dio库:dio是一个dart的 http请求通用库,目前也是大陆使用最广泛的库,国人开发,完全开源. flutter的插件包管理:学了引入di ...

  4. AWS物联网解决方案之:如何将设备安全地接入AWS IoT

    1 简介 AWS IoT解决方案是一个全托管的云平台,使互联设备可以轻松安全地与云应用程序及其他设备交互.AWS IoT可以支持数十亿太设备和数万亿条消息,并且可以对这些消息进行处理并将其安全可靠地路 ...

  5. 详解Arduino Uno开发板的引脚分配图及定义(重要且基础)

    首先开发板实物图如下: 在本篇文章中,我们将详细介绍Arduino开发板的硬件电路部分,具体来说,就是介绍Arduino Uno开发板的引脚分配图及定义.Arduino Uno微控制器采用的是Atme ...

  6. 3rd.botan

    1.HOME 1.官网:https://botan.randombit.net/ Win下 编译步骤:https://botan.randombit.net/handbook/building.htm ...

  7. gradle中 使用lombok

    plugins {     id 'java'     id "io.franzbecker.gradle-lombok" version "3.1.0"    ...

  8. 轻松搞定Vue 使用SignalR与Asp.net Core通讯

    前言 针对于Web与其他应用的的通讯,在.Net中,SignalR是一个不错的选择,在前后端没有分离的时候,直接引用对应的signalr.js文件即可: 这里主要记录Vue与Asp.netcore 前 ...

  9. Beta冲刺博客

    这个作业属于哪个课程 当然是属于程序分析与设计呀 这个作业要求在哪里 在这儿 团队名称 六扇门编程小组(团队博客) 这个作业的目标 完成为期两周的β版本冲刺 1.团队信息 姓名 学号 曹欢(组长) 2 ...

  10. Spring Boot CommandLineRunner的使用

    1. 说明 程序在启动完成的时候需要去处理某些业务,因此Spring Boot程序中需要去实现CommandLineRunner接口. 2. CommandLineRunner方法执行顺序 程序启动后 ...