java安全沙箱(三)之内置于Java虚拟机(及语言)的安全特性

java是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是:

  • 类加载体系
  • .class文件检验器
  • 内置于Java虚拟机(及语言)的安全特性
  • 安全管理器及Java API

本篇博客主要介绍下“内置于Java虚拟机(及语言)的安全特性”;其它几类安全机制会在后续博客中陆续介绍。

简介

jvm装载一个类,并且对字节码进行了四趟扫描,这些字节码就能安全地被执行了。然而去了这些安全校验,jvm在执行字节码时还进行了一些内置的安全机制校验。这些安全机制主要包括:

  • 内存自动分配
  • 自动拉机回收机制
  • 数组边界检查
  • 空指针检查
  • 异常处理机制

内存自动分配

在编写java程序时几乎不能直接分配内存,比如当new一个对象时,jvm会在堆中自动帮程序分配好内存,当在方法中申明一个引用或常量时,jvm则会在栈上自动分配好内存;不能直接分配内存能够控制程序不小心或者恶意地覆盖一些重要地内存数据。注意,前面说“几乎不能”是因为可以通过反射调用sun.misc.Unsafe的方法是可以操作指定位置的内存(当然也是有限制的);还有一种方法可以破坏内存自动分配,那就是调用jni,对于本地方法,java安全机制完全不起作用,当一个线程执行本地方法时,它就跳出了java的安全沙箱;jni是为了扩展性而牺牲了一些安全性。

自动垃圾回收机制

自动垃圾回收机制是java的一个重要特性,它的主要作用是为了防止内存泄漏,也是一种安全机制。一些没有自动垃圾回收的语言比如C++经常出现的问题是忘了调用对象的析构函数而造成内存泄漏。然而java的自动垃圾回收机制并不代表程序员不用关心内存泄漏问题了,因为内存的自动垃圾回收是需要特定条件的(无引用);自动垃圾回收机制是一个很长的话题,想要详细了解的话推荐参考《Java性能优化权威指南》的第三章。

数组边界检查

数组边界检查也是一种控制内存访问的安全机制,其它没有数组边界检查的语言很常见的一种攻击手法是“缓冲区溢出攻击”,比如程序中定义了个长度为16的数字,如果没有数组边界异常,有漏洞或者恶意的程序可能会读取或操作下标为100的内存,而该内存如果存储了重要数据,就可能别读取活着篡改,从而引发安全问题。

空指针检查

空指针检查是为了防止程序出现不可预期的结果,调用空对象的方法或者字段时会抛出java.lang.NullPointerException,这是一种非受查异常。加入程序出现空指针使用的情况,很大的可能是因为程序员的粗心导致的,如果不通过抛出异常中断程序,可能会导致不可预期的结果,比如程序员以为执行了某个对象的某个方法,但是因为使用了空对象却没有执行。

异常处理机制

最后一种安全机制就是java的异常处理,java的异常处理是基于线程的,而不是基于进程的,这样保证了异常处理是轻量级的,如果出现了异常,java会沿着方法调用栈一直往上抛,如果没有处理酒会终止指定线程,而不会终止jvm进程;这样就不会影响其它正确执行的线程。

时间: 2024-08-08 10:41:46

java安全沙箱(三)之内置于Java虚拟机(及语言)的安全特性的相关文章

Java从零开始学三十五(JAVA IO- 字节流)

一.字节流 FileOutputStream是OutputStream 的直接子类 FileInputStream也是InputStream的直接子类 二.文本文件的读写 2.1.字节输入流 Test.txt文件内容 abcdefg package com.pb.io; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOExcept

Java从零开始学三十六(JAVA IO- 字符流)

一.字符流 BufferedReader:BufferedReader是从缓冲区之中读取内容,所有的输入的字节数据都将放在缓冲区之中 BufferedWriter:把一批数据写入到缓冲区,当缓冲区区的满时,再把缓冲区的内容写到字符输出流中 二.对文本文件的读写 2.1.字符输入流 2.2.字符输出流 2.3.综合使用 package com.pb.io.buffered; import java.io.BufferedReader; import java.io.BufferedWriter;

Java从零开始学三十八(JAVA IO- 重定向IO)

一.三个静态变量 java.lang.System提供了三个静态变量 System.in(默认键盘) System.out(默认显示器) System.err 二.重写向方法 System提供了三个重定向方法 方法 说明 static void setErr(PrintStream errr) 重定向标准错误输出流 static void setIn(InputStream in ) 重定向标准输入流 static void setOut(PrintStream out) 重定向歀输出流 三.例

Java从零开始学三十三四(JAVA IO-流简述)

一.流概念(stream) File类并不能对文件内容进行读写. 读文件就是指:把文件的内中的数据读取到内存中来 写文件就是指:把内存中的数据写入到文件中去. 通过什么读写文件呢?文件流. 1.1.流概念 一连串流动的字符 1.2.流的特性 先进先出的方式传递信息 一个字节序列 具有方向性:输入流.输出流 二.按照流向划分 输入流:读取数据--InputStream和Reader作为基类 输出流:写入数据--OutputStream和Writer作为基类 一共四个4基类. 其中InputStre

再回首,Java温故知新(三):Java基本数据类型之整型

注:因为此次学习打算看一遍相关Java源码,所以更新速度一开始会相对慢一些.还有就是不得不佩服那群大牛啊,算法不是一时半会能懂的,本来打算直接弄懂的,后来感觉这样效率太低了,所以决定大体上通读一遍,反正以后肯定还会回来再次学习. Java作为一种强类型语言,意味着每一个变量都会有特定的类型,Java共有8种基本类型,其中有4种整型(byte.short.int.long).两种浮点型(float.double).1种字符型(char)和一种布尔型(boolean),值得注意的是,虽然字符串Str

JAVA学习(三):Java基础语法(变量、常量、数据类型、运算符与数据类型转换)

Java基础语法(变量.常量.数据类型.运算符与数据类型转换) 1.变量 Java中,用户可以通过指定数据类型和标识符来声明变量,其基本语法为: DataType identifier; 或 DataType identifier = value; 其中,DataType是变量类型,如int/string/char/double/boolean等:identifier是变量名称,即标识符:value就是声明变量的值. 注: a.标识符由数字0-9.大小写字母.下划线.美元符号.人民币符号以及所有

java安全沙箱(二)之.class文件检验器

java是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件检验器 内置于Java虚拟机(及语言)的安全特性 安全管理器及Java API 本篇博客主要介绍下".class文件检验器",介绍下它的基本原理:其它几类安全机制会在后续博客中陆续介绍. 简介 jvm的.class文件检验器用于检查.class文件是否拥有合法的内存结构,这种检查是有必要的,因为java的.class文件可能来自本机,也可能来自网络,可

Java进阶(三)多线程开发关键技术

原创文章,转载请务必将下面这段话置于文章开头处. 本文转发自Jason's Blog,原文链接 http://www.jasongj.com/java/multi_thread/ sleep和wait到底什么区别 其实这个问题应该这么问--sleep和wait有什么相同点.因为这两个方法除了都能让当前线程暂停执行完,几乎没有其它相同点. wait方法是Object类的方法,这意味着所有的Java类都可以调用该方法.sleep方法是Thread类的静态方法. wait是在当前线程持有wait对象锁

JAVA高级篇(三、JVM编译机制、类加载机制)

一.类的加载过程 JVM将类的加载分为3个步骤: 1.装载(Load) 2.链接(Link) 3.初始化(Initialize) 其中 链接(Link)又分3个步骤,如下图所示: 1) 装载:查找并加载类的二进制数据(查找和导入Class文件) 加载是类加载过程的第一个阶段,在加载阶段,虚拟机需要完成以下三件事情: 1.通过一个类的全限定名来获取其定义的二进制字节流. 2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构. 3.在Java堆中生成一个代表这个类的java.lang.C