java 安全方面的考虑-简单
参考 深入理解JVM
1 双亲委派模型
(1)防止不可靠的代码用自己的版本替代可信任的类。
(2)运行时包的概念:同一个类装载的、属于同一个包的、多个类型的集合。
加载java.lang.Virus这个非法的类,不能访问java.lang包中的API。
2 class文件验证器
第一趟在类被装载的时候进行,检查内部结构,保证可被编译。
第二趟在连接过程中进行,语义检查,方法描述符符合特定字符串。
第三趟在连接过程中进行,字节码验证
第四趟在解析过程中进行,符号引用的验证
CLassLoader类中loadClass的具体实现
(1)查看请求的类装载器是否已经被装载进这个类装载器的命名空间。如果确实如此,返回这个已经装载的Class实例。
(2)否则委派双亲类装载器,如果双亲返回,则返回这个Class实例。
(3)否则,调用findClass(),findClass会试图寻找或生成一个字节数组。如果成功,findClass()把字节数组传递给defineClass,后者试着导入这个类型,返回一个Class实例。如果findClass返回了一个Class实例,loadClass()把这个实例返回。
(4)否则,findClass抛出某些异常,loadClass返回同样异常。
forName 和loadClass的区别?
loadClass保证被装载的类型是被装载到用户自定义的类装载器的命名空间里,而forName确认所需的类型被装载到当前命名空间中,就是forName方法调用所属的定义类装载器的命名空间。
3 内置的安全特性
自动GC
数组边界检查
空引用检查
类型安全的引用转换
结构化的内存访问(无指针)
4 安全管理器
保护虚拟机外的资源不被运行的恶意代码破坏
5 代码签名和认证
6 策略
7 保护域
8 访问控制器