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. 教你pomeloclient包libpomelo增加cocos2d-x 3.0工程(Windows、Android、IOS平台)

    Windows平台 操作系统:Windows7(64-bit) VS版本号:2013 Cocos2d-x版本号:3.0 project路径:E:\cocos2d-prj\ 1.从github下载lib ...

  2. cocos2d-x截图功能clippingnode它也可用于——白费

    许多其他精彩分享:http://blog.csdn.net/u010229677 3.1版本号: 在Director数: bool Director::saveScreenshot(const std ...

  3. VS2010 TFS

    在本文的两个部分中,我将介绍Team Foundation Server的一些核心特征,重点介绍在本产品的日常应用中是怎样将这些特性结合在一起使用的. 作为一名软件开发者,在我的职业生涯中,我常常会用 ...

  4. Nagios经check_http监视web申请书server多个tomcat维修

    怎么样nagios显示器tomcat,它是一个相对简单的和复杂的事情.简单是因为,只有监控的假设web应用服务器tomcat无论是服务正常进行,很简单.假设你要监视tomcat其他例子,例如连接数jv ...

  5. java它们的定义ArrayList序列, 大神跳跃

    一个list有两种类型的对象,今天有需求必须责令不同的约会对象,这里是代码 /** *@author xh1991101@163.com */ List<Message> messages ...

  6. 使用AngularJS开发下一代Web应用

    原版的:https://github.com/edagarli/AngularJSWeb 来源书:https://github.com/shyamseshadri/angularjs-book 版权声 ...

  7. MDCC 2014移动开发者大会 小礼品展商活动

    MDCC 2014移动开发者大会 小礼品展商活动 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGVzdGNzX2Ru/font/5a6L5L2T/fon ...

  8. Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭

    最近一直整并发这块东西,顺便写点Java并发的例子,给大家做个分享,也强化下自己记忆. 每天起早贪黑的上班,父母每天也要上班,话说今天定了个饭店,一家人一起吃个饭,通知大家下班去饭店集合.假设:3个人 ...

  9. java战斗系列-战斗MAVENPW结构

     实战中MAVEN私服的搭建 利用maven来管理项目的构建,报告和文档已经成为了我们如今的共识,不论什么开源软件基本都在使用,当然我们如今的大部分公司也基本都在使用,我把曾经使用maven的一些经 ...

  10. POJ 2485 Highways (prim最小生成树)

    对于终于生成的最小生成树中最长边所连接的两点来说 不存在更短的边使得该两点以不论什么方式联通 对于本题来说 最小生成树中的最长边的边长就是使整个图联通的最长边的边长 由此可知仅仅要对给出城市所抽象出的 ...