java安全沙箱(三)之内置于Java虚拟机(及语言)的安全特性
java是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是:
内置于Java虚拟机(及语言)的安全特性
本篇博客主要介绍“内置于Java虚拟机(及语言)的安全特性”的基本原理;如需了解其它几类安全机制可以通过上面的博客链接进入查看。
简介
jvm装载一个类,并且对字节码进行了四趟扫描,这些字节码就能安全地被执行了。然而去了这些安全校验,jvm在执行字节码时还进行了一些内置的安全机制校验。这些安全机制主要包括:
内存自动分配
自动拉机回收机制
数组边界检查
空指针检查
异常处理机制
内存自动分配
在编写java程序时几乎不能直接分配内存,比如当new一个对象时,jvm会在堆中自动帮程序分配好内存,当在方法中申明一个引用或常量时,jvm则会在栈上自动分配好内存;不能直接分配内存能够控制程序不小心或者恶意地覆盖一些重要地内存数据。注意,前面说“几乎不能”是因为可以通过反射调用sun.misc.Unsafe的方法是可以操作指定位置的内存(当然也是有限制的);还有一种方法可以破坏内存自动分配,那就是调用jni,对于本地方法,java安全机制完全不起作用,当一个线程执行本地方法时,它就跳出了java的安全沙箱;jni是为了扩展性而牺牲了一些安全性。
自动垃圾回收机制
自动垃圾回收机制是java的一个重要特性,它的主要作用是为了防止内存泄漏,也是一种安全机制。一些没有自动垃圾回收的语言比如C++经常出现的问题是忘了调用对象的析构函数而造成内存泄漏。然而java的自动垃圾回收机制并不代表程序员不用关心内存泄漏问题了,因为内存的自动垃圾回收是需要特定条件的(无引用);自动垃圾回收机制是一个很长的话题,想要详细了解的话推荐参考《Java性能优化权威指南》的第三章。
数组边界检查
数组边界检查也是一种控制内存访问的安全机制,对于其它没有数组边界检查的语言比如C语言,很常见的一种攻击手法是“缓冲区溢出攻击”,比如程序中定义了个长度为16的数组,如果没有数组边界异常,有漏洞或者恶意的程序可能会读取或操作下标为100的内存,而该内存如果存储了重要数据,就可能被读取或者被篡改,从而引发安全问题。
空指针检查
空指针检查是为了防止程序出现不可预期的结果,调用空对象的方法或者字段时会抛出java.lang.NullPointerException,这是一种非受查异常。假如程序出现空指针使用的情况,很大的可能是因为程序员的粗心导致的,如果不通过抛出异常中断程序,可能会导致不可预期的结果,比如程序员以为执行了某个对象的某个方法,但是因为使用了空对象却没有执行。
异常处理机制
最后一种安全机制就是java的异常处理,java的异常处理是基于线程的,而不是基于进程的,这样就保证了异常处理是轻量级的,如果一个线程出现了异常,java会沿着该线程的方法调用栈一直往上层抛异常,直到异常被处理,如果每层方法栈都没有处理该异常的话就会终止该线程,而此时如果还存在非守护线程的话就不会终止jvm进程;这样就不会影响其它正确执行的线程了。
java安全沙箱(三)之内置于Java虚拟机(及语言)的安全特性的更多相关文章
- Java基础:三步学会Java Socket编程
Java基础:三步学会Java Socket编程 http://tech.163.com 2006-04-10 09:17:18 来源: java-cn 网友评论11 条 论坛 第一步 ...
- java 数据结构(三):java常用类 三 日期时间API
JDK 8之前日期时间API 1.获取系统当前时间:System类中的currentTimeMillis()long time = System.currentTimeMillis();//返回当前时 ...
- 学习java随笔第三篇:java的基本数据类型
数据类型 一:整型 1.十进制 2.八进制 八进制数是满8进1,包含0~7的8个数字,在整数前面添加一个"0",表示是八进制数. 3.十六进制 十六进制数是满16进1,包含0~9, ...
- Java从零开始学三十八(JAVA IO- 重定向IO)
一.三个静态变量 java.lang.System提供了三个静态变量 System.in(默认键盘) System.out(默认显示器) System.err 二.重写向方法 System提供了三个重 ...
- Java从零开始学三十六(JAVA IO- 字符流)
一.字符流 BufferedReader:BufferedReader是从缓冲区之中读取内容,所有的输入的字节数据都将放在缓冲区之中 BufferedWriter:把一批数据写入到缓冲区,当缓冲区区的 ...
- Java从零开始学三十五(JAVA IO- 字节流)
一.字节流 FileOutputStream是OutputStream 的直接子类 FileInputStream也是InputStream的直接子类 二.文本文件的读写 2.1.字节输入流 Test ...
- Java从零开始学三十三四(JAVA IO-流简述)
一.流概念(stream) File类并不能对文件内容进行读写. 读文件就是指:把文件的内中的数据读取到内存中来 写文件就是指:把内存中的数据写入到文件中去. 通过什么读写文件呢?文件流. 1.1.流 ...
- JAVA学习(三):Java基础语法(变量、常量、数据类型、运算符与数据类型转换)
Java基础语法(变量.常量.数据类型.运算符与数据类型转换) 1.变量 Java中.用户能够通过指定数据类型和标识符来声明变量.其基本的语法为: DataType identifier; 或 Dat ...
- java 基础(三) 搭建Java编译环境(树莓派)
安装需求1.JDK的安装2.PI4J的安装 JDK的安装1.首先到JDK的官网:https://www.oracle.com/technetwork/java/javase/downloads/ind ...
随机推荐
- 【转】浅思OC的语言特性
算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...
- Python 基础之在ubuntu系统下安装双版本python
前言:随着python升级更新,新版本较于老版本功能点也有不同地方,作为一个初学者应该了解旧版本的规则,也要继续学习新版本的知识.为了能更好去学习python,我在ubuntu安装python2和py ...
- ansible代码分析第一篇--主文件—ansible分析
2016年2月23日,学习,分析ansible代码 ansible是一种运维中使用的批量部署的工具,它本身是一种框架,具体的部署和架构分析,下面这篇文章讲的不错. http://os.51cto.co ...
- android 瀑布流效果 保存地址
http://tech.ddvip.com/2013-09/1379785198203013_2.html
- 【css】a标签的用法
<a>标签属性display的不同设置达到目的 display:block和display:inline; display:block 可以使得<a>标签设置宽高.边线.mar ...
- (进阶篇)PHP+Mysql+jQuery找回密码
通常所说的密码找回功能不是真的能把忘记的密码找回,因为我们的密码是加密保存的,一般开发者会在验证用户信息后通过程序生成一个新密码或者生成一个特定的链接并发送邮件到用户邮箱,用户从邮箱链接到网站的重置密 ...
- TOJ3136
3136: Ubiquitous Religions 时间限制(普通/Java):2000M ...
- JUnit报错需导入两个jar包
<dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</a ...
- Android——JDK的get请求方式
layout文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ...
- Codeforces Round #379 (Div. 2) F. Anton and School
题意: 给你n对 b[i], c[i], 让你求a[i],不存在输出-1 b[i] = (a[i] and a[1]) + (a[i] and a[2]) + (a[i] and a[3]) +... ...