反序列化铺垫,java中部分框架与机制的介绍。

RPC框架。

RPC是远程过程调用的简称,广泛应用在大规模分布式应用中,作用是有助于系统的垂直拆分,使系统更易拓展。Java中的RPC框架比较多,各有特色,广泛使用的有RMI、Hessian、Dubbo等。RPC的特点之一就是能够跨语言。下面我们以java自带的RMI框架为例。

首先要明白,编程中这些较高级的概念都是由最基础的代码累加而成的,RPC中涉及到的分布式的概念,就是基于java的socket,序列化,反序列化与反射来实现的。

举例:

  假设客户端要调用A对象的A方法,但是A对象A方法在服务端并不在客户端,那么客户端会生成A对象的代理对象,通过socket与服务端建立连接将A对象A方法的参数序列化后传给服务端,服务端反序列化后得到参数,并且通过反射的方式调用A对象的A方法,然后将结果返回给客户端,达到貌似客户端调用了服务端A对象A方法的效果。

那么在继续之前,我们先来说说java中的socket与反射。

java中的socket

  Socket套接字是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
        Socket本质是编程接口,对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。(借用了网上的说法,但是原文找不到了。。。)
  Socket的通信流程就是服务端监听,客户端请求,确认然后建立连接。

  这里就不具体举例了,会在后续RMI中实际使用到。

java中的反射机制

  在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。

  想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属性,类名,父类名,实现的所有接口等等),每一个类对应着一个字节码文件也就对应着一个Class类型的对象,也就是字节码文件对象。

  总来说通过反射机制我们可以透明的得到java中所有的内容。接下来只要了解一下class类的api就好了,请自行查阅。

  这里只是提一嘴需要而已嘿嘿。(懒的写了

RMI

  比较特殊的是RMI在客户端与服务端之间额外增加了注册中心(registry),关于这个请看看这篇文章:http://mp.weixin.qq.com/s/tAPCzt6Saq5q7W0P7kBdJg

  极其详细且有源码分析。

CC链

  即Commons Collections利用链,在java反序列化中经常被提及,在此提示,本身CC链不存在问题,是不正确的对于序列化与反序列化的管控导致的反序列化漏洞,CC只是一个攻击点,不是漏洞的产生点,利用工具推荐网上常见的ysoerial。(之后会有这个工具的源码分析文章,咳,我尽快。)

好的,了解以上四部分,接下来让我们愉快的进行反序列化实验。

  

posted @ 2021-09-10 16:56  HOloBlogs  阅读(49)  评论(0)    收藏  举报