Java的沙箱机制原理入门

2024-06-12 08:48
文章标签 java 入门 原理 机制 沙箱

本文主要是介绍Java的沙箱机制原理入门,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



程序员写一个Java程序,默认的情况下你可以访问任意的机器资源,比如读取,删除一些文件或者网络操作等。当你把程序部署到正式的服务器上,系统管理员要为服务器的安全承担责任,那么他可能不敢确定你的程序会不会访问不该访问的资源,为了消除潜在的安全隐患,他可能有两种办法:

1,让你的程序在一个限定权限的帐号下运行;
2.利用Java的沙箱机制来限定你的程序不能为非作歹。我们这里主要谈谈后一种方法。


怎样给一个程序设置一个“沙箱”呢?这个设置应该是避免改动程序代码的,而且是简单易行的。根据Java的文档,我们了解到只需简单的两个步骤。


步骤一.加一个运行参数,就可以让一个程序在沙箱里运行:
   java -Djava.security.manager -jar myapp.jar


步骤二.设置具体的权限,比如创建自己的策略文件myapp.policy:
   grant codeBase "file:${user.dir}/myapp.jar" {

    permission java.io.FilePermission "${user.dir}${/}*", "read";

   };


这个设置的意思是,从myapp.jar载入的代码,对当前目录下的所有文件有“读”的权限。

做完这两个步骤后,运行命令:
   java -Djava.security.manager -Djava.security.policy==myapp.policy -jar myapp.jar


就可以保证程序只拥有你指明的权限。当访问其他资源时,会抛出类似"access denied"的异常。系统默认的策略文件是${java.home}/jre/lib/security/java.policy,它拥有的权限非常少,而且都与访问系统资源无关。


那么问题随之而来,这一切是怎么实现的?检查的代码在哪里,又是谁来开发的这些代码?

答案是:这是SUN干的,SUN早把这些检查的代码插入到所有访问系统资源的API里面了。


举一个读取文件的例子,比如:
     BufferedReader br = new BufferedReader(new FileReader(fileName));
     String line = br.readLine();


当你运行到第一行,继续调试进Java API源代码里,就可以碰到下面的一段代码:

SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkRead(name);
    }


这里的代码表示,如果安装了SecurityManager,那么将进行安全检查(是否对这个文件具有读的权限)。而当你加上运行参数-Djava.security.manager,即表示安装了SecurityManager。这里和上面的第一个步骤对应。

继续调试进去,看到下面的代码:
checkPermission(new FilePermission(file,
        SecurityConstants.FILE_READ_ACTION));


很明显,这和上面的第二个步骤对应,FilePermission即为java.io.FilePermission,FILE_READ_ACTION即为“read”。
那么codeBase和什么对应呢?


codeBase涉及到ClassLoader方面的知识了,简单的说,ClassLoader加载一些代码的时候,它会把代码来源的信息保存下来,这些信息结合从策略文件里读取的信息,系统就可以来做出决策了。


细节总是复杂的,但在理解这个原理后去深入细节,就能起到引领的作用。 这里最让人疑惑的地方不是策略文件的配置和规则,而是谁在决策,在什么时候决策。可能有人提出一个问题,如果我不用SUN的API,我自己去写一些代码访问机器上的资源,那不就可以绕开“沙箱”了吗?理论上是可以的,但只要你写的是Java代码,并且仍使用SUN的虚拟机,那么你就没有这个机会。SUN的类加载器机制保证了你不能去替代或者干涉它的核心类库。

本文来自CSDN博客,转载请标明出处:<a class="keylink" href="http://blog.csdn.net/kevinkevin/archive/2010/12/04/6054980.%3Ca%20href=" target="_blank" www.2cto.com="" kf="" web="" asp="" "="">aspx">http://blog.csdn.net/kevinkevin/archive/2010/12/04/6054980.aspx

这篇关于Java的沙箱机制原理入门的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1053739

相关文章

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析