保证java安全性的几点:
- 类装载器结构
- class文件检验器
- 基于内置的jvm及语言的安全特性
- 安全管理器
1.类装载器的体系结构
类装载器在三个方面对安全起作用
- 它防止恶意的代码去干涉善意的代码
- 它守护了受信任的类库边界
- 它将代码归入某类(保护域),该类确定了代码可以执行哪些操做
双亲委派模式:除启动类装载器,每一个类都有一个“双亲”类装载器,在特定的类装载器试图装载某类型前,会将任务委派给它的双亲,这个双亲再委派它的双亲装载这个类型,这个过程一直向上继续,直到启动类装载器,如果一个类的双亲有能力装载这个类型,则由双亲进行装载,否则,由这个类加载器自己装载。
启动类装载器只负载装载核心java API,这是最可信的类库
如类文件想加载一个java.lang.Integer,则会由启动类装载器进行装载,这样防止了不可靠的代码用它们自己的类替换可信任的类
java允许同一个包中的类有互相访问的权限,如果自己定义一个java.lang.Virus类,由Virus类进行破坏也是不可行的,因为java只允许由同一个类装载器装载到同一个包中的类型有互相访问的权限(运行时包),Virus类不是由启动类装载器进行装载的。
2.class文件检验器:保证装载的class文件有正确的内部结构
四次独立的扫描:
- 第一次:class文件结构检查:是否由魔数开头;检查主版本号与次版本号是否在java虚拟机的可实现范围内;class文件中的每一个部分都声明了长度和类型,检查长度是否正确,有无删节和附带
- 第二次:类型数据的语意检查:检查每个组成部分结构是否正确,方法格式是否正确,除了Object类是否都有超类,final有无被覆盖,常量池索引是否合法
- 第三次:字节码验证:确定操作码操作数的正确合法,字节码流能被虚拟机安全执行
- 第四次:符号引用的验证:从验证的class文件到被引用的class文件,以保证这个引用正确,对类,字段,方法进行检查。大多数虚拟机采用延迟装载策略,这次验证可能在第三次验证后很久,字节码被执行时才进行
3.java虚拟机内置的安全特性
- 并未指明运行时数据空间在java虚拟机内是如何分布的,在class文件中找不到任何内存地址
- 异常的结构化处理:发生异常时不会导致整个程序终止,只会导致发生异常的线程死亡,并能控制程序转到处理异常的地方
4.安全管理器