freebuf关于动态代理实现安全防护的文章,由于 之前 做过类似组件,所以看了一下。
文章在这:http://www.freebuf.com/articles/web/118334.html
AOP技术概念:
面向侧面的程序设计(aspect-oriented programming,AOP,又译作面向方面的程序设计、观点导向编程、剖面导向程序设计)是计算机科学中的一个术语,指一种程序设计范型。该范型以一种称为侧面(aspect,又译作方面)的语言构造为基础,侧面是一种新的模块化机制,用来描述分散在对象、类或函数中的横切关注点(crosscutting concern)。
jar包与动态代理对比
动态代理优点在于可以对委托类的相关函数进行统一的处理,一旦安全规则被bypass我们只需要在代理工厂类中修改invoke函数里面的逻辑即可。但是同样也有弊端,比如出现误报,如果修改invoke了过滤逻辑,那么其他委托类可能也会受到影响。
jdk动态代理方式实现aop
条件:委托类需要实现接口,代理类需要实现InvocationHandler接口,并实现其中的public Object invoke(Object proxy, Method method, Object[] args)方法。
看下具体的实现原理:
代理工厂类创建
1、创建代理工厂类JDKProxyFactory实现接口InvocationHandler,首先创建获取代理类对象的方法newProxyInsance()
2、实现InvocationHandler接口的invoke方法,在动态代理中InvocationHandler是核心,每个代理实例都具有一个关联的调用处理程序(InvocationHandler)。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序(InvocationHandler)的 invoke 方法。
在invoke方法中可以加入安全防护逻辑,这就是所谓的AOP实现安全编程
cglib实现aop
优点是委托类不需要实现接口,也就是应用场景没有限制,但是相对JDK动态代理来说有点重了。
1、创建代理工厂类CGlibProxyFactory实现接口MethodInterceptor,首先创建获取代理类对象的方法createOrder()
public Object createOrder(Object object) { this.obj = object; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(object.getClass()); enhancer.setCallback(this); return enhancer.create(); }
2、实现接口MethodInterceptor intercept方法
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { Object result = null; //XSS过滤逻辑 String info= AntiXSS.HtmlEncode(args.toString()); //SQLI注入防护 String info1= AntiSQLI.EncodeSQLI(args.toString()); //命令执行防御 String info2= AntiRCE.RCEDEF(args.toString()); result = methodProxy.invoke(obj, args); return result; }
组件实现安全自愈
我的理解,如果code 严格按照 框架的安全规范和接口说明文档来编写,该编码转义的地方进行编码转义,该参数化查询的地方参数化查询,是不需要这样的安全过滤防护的。所以如果安全组件能把研发编写的漏洞代码用框架内置的安全函数自动化解决,就可以卸载AOP安全过滤逻辑,就是系统的自愈,可达到零报率,同时也提高了程序的性能。
无论是WAF还是安全API的规则编都是在误报与漏报之前徘徊。有对JAVA安全组件组开的朋友可以交流下安全过滤规则的编写,规则的动态生效问题,组件实现系统的自愈功能等。
参考
深度剖析JDK动态代理机制
http://www.cnblogs.com/MOBIN/p/5597215.html
利用 AOP 进行 Dao 层 antiXSS 过滤
https://toutiao.io/posts/nlrrqo/preview