您好,欢迎来到好走旅游网。
搜索
您的当前位置:首页Java安全知识

Java安全知识

来源:好走旅游网
Java平台提供的原始安全模式是沙箱模式。对于从开放网络中得到的是不被信任的代码,该模型提供了一个非常严格的使用环境。沙箱模型的实质在于信任本地代码。使其完全可以访问重要的资源(例如文件系统);而下载的远程代码则不被信任,因而只能访问沙箱内提供的有限资源。沙箱模型通过Java开发工具包(JDK)发布,一般被用JDK编写的应用程序所采纳(包括支持Java的网络浏览器)。Java沙箱是运行Java小应用程序的一个软件单元,对于Java小应用程序的访问权限加以,防止它访问计算机的关键部分,如磁盘驱动器、网络套接口和内存区。Java沙箱有三部分组成:字节码检验器、类装载器和安全管理器,这三部分共同完成装载和运行时对JavaApplet的检验,用以对文件系统和网络访问及对浏览器内部的访问。Java程序可以从网络上下载运行,这必然会带来很多不安全因素。一些恶意的Hacker可以直接写出直接代码段攻击用户节点,如删除文件、搞乱硬盘或未经用户许可在网上发布本地信息等。这些防卫本地机被攻击的任务就交给了Java虚拟机完成。Java虚拟机提供了几种安全机制,其中两种主要的安全机制是安全管理器和Java类文件认证器。安全管理器时安全的实施者,它是一个可扩展类,提供加在应用程序和特殊系统上的安全措施。它实现Java虚拟机的安全策略。安全管理器建立Java程序的名空间,的对网络、本地文件系统和其他部分的访问。Java认证器在.class文件运行前完成该文件的安全检查,确保Java字节码符合Java虚拟机规范。Java平台通过使用认证器查看类文件的句法和词法的正确性,检查版本及API符合性等,保证病毒和其他恶意程序不会侵犯本地系统。认证器包括四个阶段的的操作:类文件认证、类型系统认证、字节码认证和运行时类型的访问检查。此外,认证器在检查期间还能识别算法操作的上溢和下溢等其他可能发生在运行期间的程序错误。Java虚拟机是加在当前主机操作系统上的,由于Java字节码执行速度目前要比本地机器慢10到20倍,速度问题可能是影响Java推广的唯一原因。目前,针对Java虚拟机程序速度慢的问题,Microsoft、Borland等提出了及时编译技术(Just-In-Time)JIT。具体说,就是JIT编译器在程序开始执行前把所有字节码翻译成本地机器码,然后再将翻译后的机器码放在CPU上运行。这样,就用字节码编译器代替了原来的解释器,它对用户透明又提高了执行速度也许将来JIT编译器加到Java虚拟机中,可以解决所有性能问题。Java是如何管理内存的?

答案:Java的内存管理就是对象的分配和释放问题。在Java中,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对象都在堆(Heap)中分配空间。另外,对象的释放是由GC决定和执行的。在Java中,内存的分配是由程序完成的,而内存的释放是由GC完成的,这种收支两条线的方法却是简化了程序员的工作。但同时,它也加重了JVM的工作。这也是Java程序运行速度较慢的原因之一。因为,GC为了能够正确释放对象,必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行监控。监视对象状态是为了更加准确地、及时地释放对象,而释放对象的根本原则就是该对象不再被引用。为了更好地理解GC的工作原理,我们可以将对象考虑为有向图的顶点,将引用关系考虑为图的有向边,有向边从引用者指向被引用对象。另外,每个线程对象可以作为一个图的起始顶点,例如,大多程序从main进行开始执行,那么该图就是以main进程顶点开始的一棵根树。在这个有向图中,根顶点可达的对象都是有效对象,GC将不回收这些对象。如果某个对象(连通子图)与这个根顶点不可达(注意,该图为有向图),那么我们认为这个(这些)对象不再被引用,可以被GC回收。用有向图表示内存管理。对于程序的每一个时刻,都有一个有向图表示JVM的内存分配情况。以下的图,就是左边的代码的示意图。classtest{publicstaticvoidmian(Stringa[]){Objecto1=newObject();Objecto2=newObject();o2=o1;//此行为第6行}}o1O2什么是Java中的内存泄露?

答案:在Java中,内存泄露就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄露,这些对象不会被GC说回收,然后它们却占用内存。在C++中,内存泄露的范围更大一些。有些对象被分配了内存空间,然后却不可达,由于C++中没有GC,这些内存将永远的收不回来。在Java中,这些不可达的对象都由GC负责回收,因此程序员不需要考虑这部分的内存泄露。对于C++,程序员需要自己管理边和顶点,而对于Java程序员只需要管理边就可以了(不需要管理顶点的释放)。通过这种方式,Java提高了编程的效率。对于程序员的来说,GC基本是透明的,不可见的。虽然我们只有几个函数可以访问GC,例如,运行GC的函数System.gc(),但是根据Java语言规范定义,该函数不保证JVM的垃圾收集器一定会执行。因为,不同的JVM实现者可能使用不同的算法管理GC。通常,GC的线程的优先级别较低。JVM调用GC的策略也有很多种,有的是内存使用到达一定程度时,GC才开始工作,也有定时执行的,有的是平缓执行GC,有的是中断式执行GC。但通常来说,我们不需要关系这些。除非在一些特定的场合,GC的执行影响应用程序的性能,例如,对于基于Web的实时系统,如网络游戏等,用户不希望GC突然中断应用程序执行而进行垃圾回收,那么需要调整GC的参数,让GC能够通过平缓的方式释放内存,例如,将垃圾回收分解为一些列的小步骤执行。Sun提供的HotSpotJVM就支持这一特性。下面给出一个简单的内存泄露的例子。在这个例子中,循环申请Object对象,并将所申请的对象放入一个Vector中。如果仅仅释放引用本身,那么Vector仍然引用该对象,所以这个对象对GC来说事不可回收的。因此,如果对象加入到Vector后,还必须从Vector中删除,最简单的方法是将Vector对象设置为null。Vectorv=newVector(10);for(inti=1;i<100;i++){Objecto=newObject();v.add(o);o=null;}//此时,所有的Object对象都没有被释放,因为变量v引用这些对象。内存泄露只要由什么引起?都有什么样的情况?解析:忘记“释放”先前分配的内存,就可能造成内存泄露。如果程序保留对永远不再使用的对象的引用,这些对象将会占用内存并耗尽内存,这是因为自动化的垃圾收集器无法证明这些对象将不再使用。如果存在一个对对象的引用,对象就被定义为活动的,因此不能删除。为了能确保能回收对象占用的内存,编程人员必须确保该对象不能到达。这通常是通过将对象字段设置为null或者从集合(collection)中移除对象而完成的。但是,注意,当局部变量不再使用时,没有必要将其显示地设置为null。对这些变量的引用将随着方法的退出而自动清除。概括的说,这就是内存托管语言中的内存泄露产生的主要原因:保留下来却永远不再使用的对象引用。典型的内存泄露及其原因如下。1全局集合在大的应用程序中有某种全局的数据储存库是很常见的,例如,一个JNDI树或一个会话表。在这些情况下,必须注意管理储存库的大小。必须有某种机制使得从储存库中移除不再需要的数据。这可能有多种方法,但是最常见的一种是周期性运行的某种清除任务。该任务将验证储存库中的数据,并移除任何不需要的数据另一种管理储存库的方法是使用反向链接(referrer)(引用计数)计数,然后集合负责统计集合中每个入口的反向链接的数目。这要求反向链接告诉集合何时会退出入口。当反向链接数目为零时,该元素就可以从集合中移除了。2缓存缓存是一种数据结构,用于快速查找已经执行的操作的结果。因此,如果一个操作执行起来很慢,对于常用的输入数据,就可以将操作的结果缓存,并在下次调用该操作时使用缓存的数据。缓存都是以动态方式实现的,其中新的结果是在执行时添加到缓存中的。典型的算法如下。ⅰ检查结果是否在缓存中。ⅱ如果结果不在缓存中,就进行计算。ⅲ将计算出来的结果添加到缓存中,以便以后对该操作的调用可以使用。该算法问题(或者说潜在的内存泄露)出在最后一步。如果调用该操作时有相当多的不同输入,就将有相当多的结果存储在缓存中。很明显这不是正确的方法。为了预防这种具有潜在破坏性的设计,程序必须确保对于缓存所使用的内存容量有一个上限。因此,更好的算法如下。ⅰ检查结果是否在缓存中。ⅱ如果结果不在缓存中,就进行计算。ⅲ如果缓存所占的空间过大,就移除缓存最久的东西。ⅳ将计算出来的结果添加到缓存中,以便以后对该操作的调用可以使用。通过始终移除缓存最久的结果,我们实际上进行了这样的假设:在将来,比起缓存最久的数据,最近输入的数据更有可能用到。这通常是一个不错的假设。新算法将确保缓存的容量处于预定义的内存范围之内。确切的范围可能很难计算,因为缓存中的对象在不断变化而且它们的引用包罗万象。为缓存设置正确的大小是一项非常复杂的任务,需要将使用的内存容量与检索数据的速度加以平衡。解决这个问题的另一个方法是使用java.lang.ref.SoftReference类跟踪缓存中的对象。这种方法保证这些引用能够被移除,如果虚拟机的内存用尽而需要更多堆的话。ClassLoaderJavaClassLoader结构使用为内存泄露提供了许多可乘之机。正是该结构本身的复杂性使ClassLoader在内存泄露方面存在如此多的问题。ClassLoader的特别之处在于它不仅涉及“常规”对象的引用,还涉及元对象的引用,比如字段、方法和类。这意味着只要有字段、方法、类或ClassLoader的对象的引用,ClassLoader就会驻留在JVM中。因为ClassLoader本身可以关联及其静态字段,所以就有许多内存被泄露了。下面谈一谈如何确定泄露的位置。通常发生内存泄露的第一个迹象是:在应用程序中出现了OutOfMemoryError。这通常发生在你最不愿意它发生的生产大环境中,此时几乎不能进行调试。有可能是因为测试环境运行应用程序的方式与生产系统不完全相同,因而导致泄露只出现在生产中。在这种情况下,需要使用一些开销较低的工具来监控和查找内存泄露。还需要能够无需重启系统或修改代码就可以将这些工具连接到正在运行的系统上。可能最重要的是,当进行分析时,需要能够断开工具而保持系统不受干扰。虽然OutOfMemoryError通常都是内存泄露的信号,但是也有可能应用程序正在使用这么多的内存。对于后者,必须增加JVM可用的堆的数量,或者对应用程序进行某种修改,使它使用较少的内存。但是,在许多情况下,OutOfMemory都是内存泄露的信号。一种查明方法是不间断地监控GC的活动,确定内存使用量是否随着时间增加。如果确实如此,就可能发生了内存泄露。3Java的安全性的特点主要体现在什么地方?答案:Java的安全性在语言级上提供了很好的安全措施,主要体现在以下方面。1严格遵循面向对象的规范。这样封装了数据细节,值提供接口给用户,增加了数据级的安全性。2无指针运算。Java中的操作,除了基本类型都是引用的操作。引用是不能进行增减运算,不能被直接赋予内存地址的,从而增加了内存级的安全性。3数组边界检查。这样就不会出现C/C++中的缓存溢出等安全漏洞。4强制类型转换。非同类型的对象之间不能进行转换,否则会抛出ClassCastException。5语言对线程安全的支持。Java从语言级支持线程从而从语法和语言本身做了很多对线程的控制和支持。此外,Java的安全还通过编译器、检验器、类装载器、建立安全策略等方式保证了Java程序的安全性。J2EE如何保护Web应用程序安全性?

答案:J2EE提供了两个用于保护Web应用程序的基本机制。1加密。有一个机制用于指定访问特定的URL时,是否必须使用SSL(安全套接字层,SecureSocketLayer)。使用SSL时,它可以确保中间人不能查看和修改用户浏览器和服务器之间的通信。SSL还允许用户核实,他们是将消息(可能是机密的)发送给预定的目的地,而不是发送给冒名的顶替着。2基于角色的安全性。角色是授予用户的权限集合,它支持站点运行特定的用户访问站点的不同部分。可以使用声明性的方法,即把特定的URL给属于某个角色组的用户,也可以使用编程接口来确定当前用户是否属于某个特定角色。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- haog.cn 版权所有 赣ICP备2024042798号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务