java通过所谓的沙箱安全模型保证了其安全性,以下我们就来看看java提供的安全沙箱机制。

组成沙箱的基本组件例如以下:
1.类装载器结构;
2.class文件检验器;
3.内置于java虚拟机(及语言)的安全特性;
4.安全管理器及java API。


一.类装载器体系结构
    1.防止恶意代码去干涉善意的代码。

        这是通过为不同类载入器提供不同的命名空间来实现的,在java虚拟机中,在同一个命名空间内的类能够直接进行交互,而不同的命名空间中类甚至不能觉察彼此的存在。除非显式地提供同意它们交互的机制。
    2.守护了被信任的类库的边界
     
  虚拟机通过使用不同的类装载器装载可靠的包和不可靠的包。即所谓的双亲委派模式:在某个特定的类装载器试图以经常使用方式装载类型之前,它会先默认将这个任务“委派”给它的双亲,这个双亲再依次请求自己的双亲来装载这个类型。这个委派的过程一直向上继续,直到达到启动类载入器(boostrp classloader)。假设一个类载入器的双亲类载入器有能力装载这个类型,则这个类载入器返回这个类型,否则这个类装载器试图自己来装载这个类型。
        java虚拟机仅仅把彼此訪问的特殊权限授予由同一个类装载器装载到同一个包中的类型。在同意两个类型之间对包内可见的成员(声明为受保护的或者包訪问的成员)进行訪问之前,虚拟机不但要确定这两个类型是否属于同一个包,还要确定它们属于同一个执行时包——即它们必须是由同一个类装载器装载的。

 3.将代码归入某类(称为保护域),该类确定了代码能够进行哪些操作。
二.class文件检验器
   和类载入器一起,class文件检验器保证了装载的class文件内容中有正确的内部结构,而且这些class文件相互间协调一致,假设class文件检验器在class文件里发生了问题,它将抛出异常。

好的java编译器不应该产生畸形的class文件,可是java虚拟机并不知道某个特定的class文件的来源,所以java虚拟机的实现必须有个class文件检验器,文件检验器能够调用class文件以确保这些定义的类型能够安全的使用。

    java虚拟机的class文件检验器在字节码运行之前,必须完毕大部分检验工作。class文件检验器须要经过四趟独立的扫描来完毕其工作。

第一趟扫描是在类被装载时进行的,在这次扫描中,class文件检验器检查这个class文件内部结构。以保证它能够被安全地编译。

第二和第三趟扫描是在连接过程进行的,在这两次扫描中,class文件检验器确认类型数据遵从java编程语言的语义。包括检验它所包括的全部字节码的完整性。第四趟扫描是在进行动态链接的过程中解析符号引用时进行的,在这次扫描中。class文件检验器确认被引用的类、字段以及方法确实存在。

    第一趟扫描:class文件结构检查
    对每一段被当做类型导入的字节序列。class文件检验器都会确认其是否符合class文件格式。比方是否以魔数0xCAFEBABE开头,主次版本号号所代表的的版本号是否被当前虚拟机支持等等。第一趟扫描的主要目的就是保证这个字节序列正确地定义了一个新类型,它必须遵从class文件的固定格式。这样它才干被编译成在方法区中的内部数据结构。

第二、第三和第四趟扫描是在方法区中由实现决定的数据结构上进行的。

    第二趟扫描:类型数据的语义检查
     检验一些java语言应该在编译时遵守的强制规则。比方除了Object外,全部类必须有一个父类,final类没有被子类化,常量池中的条目是合法的,并且常量池中的全部索引都指向了正确类型的常量池条目。
    第三趟扫描:字节码验证
    在这趟扫描中。java虚拟机对字节流进行数据流分析。这些字节流代表的是类的方法。它确保局部变量在赋值之前不可訪问。类的字段中总必须赋予正确类型的值等等。

    第四趟扫描:符号引用验证
    在动态链接的过程中,假设包括在一个class文件里的符号引用被解析时,class文件检验器将进行第四趟检查。在这趟检查中,java虚拟机将追踪那些引用。从被验证的class文件到被引用的class文件,确保这个引用是正确的。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hkamo=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

三.java虚拟机中内置的安全特性
java虚拟机装载了一个类,而且对它进行了第一到第三趟的class文件检验,这些字节码就能够被执行了。

除了对符号引用的检验(class文件检查的第四趟扫描)。java虚拟机在执行字节码时

还进行了一些内置的安全机制的操作。

这些机制大多数是java类型安全的基础:

1.类型安全的引用转换。
2.结构化的内存訪问(无指针算法);
3.自己主动垃圾收集;
4.数组边界检查。
5.空引用检查。

    内置在java虚拟机中的还有一个安全特性,并未指明执行时数据空间在java虚拟机内部分布式如何的。假设查看class文件的内部,将看不到不论什么内存地址(全是符号引用和无符号数)。当java虚拟机装载一个class文件是,由它决定将这些字节码以及其它从class文件里解析得到的数据放置在内存的什么地方。当虚拟机启动一个线程时。由它决定将这个线程创建java栈放到哪里。
    最后,java虚拟机拥有异常的结构化错误处理机制。由于java虚拟机支持异常,所以当一些违反安全的行为发生时。它会做一些结构化处理。java虚拟机将抛出一个异常或者错误,而不是崩溃。
四.安全管理器和java API
安全管理器定义了沙箱的外部边界,保护虚拟机的外部资源不被虚拟机内执行的恶意或者有漏洞的代码侵犯。javaAPI在进行一个可能不安全的操作前,总是会检查安全管理器,所以javaAPI不会在安全管理器建立的安全策略下执行被禁止的操作。

详细能够參考java.lang.SecurityManager类别。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

java安全性语言的更多相关文章

  1. Notes 20180506 : Java程序设计语言概述

    2.Java程序设计语言概述 如果对于开发语言的排行榜有所关注的话,那么会发现很长一段时间以来Java都是位居榜首的高级开发语言,作为一个Java开发者,为此感到骄傲的同时也深感忧虑,骄傲的是自己接触 ...

  2. java笔记--java的语言特性

    java的语言特性 1.简单性:例如:java不再支持多继承,而c++是支持多继承的,多继承比较复杂. c++中有指针,java中屏蔽了指针的概念.所以相对来说比较简单. //注:java语言的底层是 ...

  3. MySQL安全性语言

    文章为作者原创,未经许可,禁止转载.    -Sun Yat-sen University 冯兴伟 实验2:安全性语言 安全性实验包含两个实验项目,其中1个为必修,1个为选修.自主存取控制实验为设计型 ...

  4. JAVA在语言级支持多线程

    进程:任务 任务并发执行是一个宏观概念,微观上是串行的. 进程的调度是有OS负责的(有的系统为独占式,有的系统为共享式,根据重要性,进程有优先级). 由OS将时间分为若干个时间片. JAVA在语言级支 ...

  5. Java程序语言的后门-反射机制

    在文章JAVA设计模式-动态代理(Proxy)示例及说明和JAVA设计模式-动态代理(Proxy)源码分析都提到了反射这个概念. // 通过反射机制,通知力宏做事情 method.invoke(obj ...

  6. Java的语言特点详解

    1)简单性:java从C++简化而来,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的.java还剔除了C++操作符过载和指针操作. 2)面向对象:java是一个面向对象的语 ...

  7. java安全性-引用-分层-解耦

    Java不支持指针, 一切对内存的访问都必须通过对象的实例变量来实现,这样就防止程序员使用 "特洛伊"木马等欺骗手段访问对象的私有成员 访问一个对象必须通过这个对象的引用 java ...

  8. 有 a - b < c 对Java安全性的思考

    软件工程中,不论使用哪种开发语言,安全性一直是一个非常棘手却又重要的问题.安全性是软件开发领域永远的主题之一,而且随着互联网的蜂拥发展而带动的新技术的兴起与革命(比如近几年火起来的node.js,py ...

  9. C/C++/Java/C#语言的基本类型

    C语言的基本类型有:char, short ,int ,long ,float ,double 一共6种基本类型. C++语言有:bool, char ,wchar_t, short, int , l ...

随机推荐

  1. PHP Html 弹窗,本页面弹窗子页面

    echo '<script type=text/javascript>window.open("","name1","width=100, ...

  2. android client随机验证码生成函数

    由于该项目使用验证码.自己找了一些资料.尽量把这个验证码做出来.代码不是很,較的简单,以下给大家看看我是怎么实现该功能的: 源代码地址下载:http://download.csdn.net/detai ...

  3. Python学习入门基础教程(learning Python)--3.1Python的if分支语句

    本节研究一下if分支语句. if分支语句是Python下逻辑条件控制语句,用于条件执行某些语句的控制操作,当if后的条件conditon满足时,if其下的语句块被执行,但当if的控制条件condito ...

  4. 关于QTP

    关于QTP,我也才接触,只是上来记录一下安装过程,免得以后忘记,又要查一堆资料. 简单介绍一下QTP: QTP的基本功能包括2个部分:一部分是提供给初级用户使用的关键字视图:另一部分是提供给熟悉VBS ...

  5. 第一章_servlet

    [Servlet与Jsp学习指南] *学习这servlet前.需要下载servlet-api.jar,MyEclipse给自己带来的需求javaEE3.0的天赋足以使用注解获得的版本号servlet ...

  6. 尺取法 poj3061 poj3320

    尺取法就是反复推进区间的开头和结尾,来求满足条件的最下区间. poj3061 http://poj.org/problem?id=3061 给定一个都是正整数的序列,要我们求总和不小于S的连续子序列的 ...

  7. Java实现BASE64编解码器

    Java实现BASE64编解码器 笔者:chszs,转载注明.博客首页:http://blog.csdn.net/chszs BASE64和其它类似的编码算法通经常使用于转换二进制数据为文本数据,其目 ...

  8. hadoop namenode -format Couldn&#39;tload main class &quot;-Djava.library.path=.home.hadoop.hadoop-2.5.2.lib&quot;

    <pre name="code" class="sql">[hadoop@MasterHadoop50 ~]$ hadoop namenode -f ...

  9. 【Android进阶】Android面试题目整理与讲解(二)

    1. ArrayList,Vector, LinkedList 的存储性能和特性 ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们 ...

  10. php zip文件内容比較类

    php zip 文件比較类,比較两个zip文件的内容,返回新增,删除,及同样的文件列表.临时仅仅支持单层. 需求:上传一个zip文件,zip内有非常多图片文件.须要对图片文件进行一系列非常耗时的处理. ...