程序员写一个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的类加载器机制保证了你不能去替代或者干涉它的核心类库。
相关推荐
### Java私塾基础入门笔记概览 #### 一、Java简介与版本 Java是一种功能强大的计算机编程语言,它不仅是一种软件开发平台,还是一种软件运行平台(Java Runtime Environment,简称JRE),支持软件的部署。Java的...
由于Applet运行在用户的机器上,为了安全考虑,Java沙箱模型对Applet施加了一些限制,比如无法直接访问本地文件系统或网络资源,除非获取了用户的明确许可。 8. **Applet与Java Web Start** 随着Java Web Start的...
- Java 通过沙箱模型提供安全保护,例如 `System.` 类中的方法提供了安全验证机制,确保 Java 程序在一个相对安全的环境中运行。 5. **体系结构中立**: - Java 字节码可以在任何支持 Java 的平台上运行,这意味...
- **安全沙箱**: JVM的安全沙箱机制限制了程序对外部资源的访问权限,提高了应用程序的安全性。 #### 三、Java开发环境配置 **3.1 安装Java Development Kit (JDK)** - **下载与安装**: 从Oracle官网或其他可信...
2. **安全性和稳定性**:Java2加强了安全性措施,包括沙箱机制、数字签名等,确保应用程序不会对系统造成损害。同时,它的垃圾回收机制也提高了程序的稳定性和响应速度。 3. **多线程支持**:Java2提供了强大的多...
Java的沙箱机制使得Java应用程序在执行时受到限制,防止恶意代码对系统造成破坏。理解权限模型、安全策略文件以及如何自定义安全管理器是提升应用程序安全性的关键步骤。 在实践中,还需要关注SQL注入、跨站脚本...
### Java入门+提高课程知识点详解 #### 一、Java开发环境和程序设计初步 ##### 1.1 Java语言发展历史 Java是由Sun Microsystems公司的James Gosling等人于1995年设计的一种面向对象的编程语言。最初的目标是为...
10. **安全性**:Java移除了如指针这样的不安全元素,增强了内存安全,并提供沙箱机制以保护系统。 11. **动态性**:Java允许程序在运行时动态加载和使用类,增强了灵活性和适应性。 【Java版本分类】 Java的发展...
### Java经典入门知识点详解 #### 一、Java概述与历史背景 Java自1995年由Sun Microsystems发布以来,迅速成为最受欢迎的编程语言之一。它以其简单性、面向对象、平台无关性和安全性著称,特别是在互联网领域发挥...
- 垃圾回收机制原理 - 性能调优策略 #### 七、JAVA 3D 魔方源代码 - **内容概述**:提供了一个基于Java 3D API的魔方实现示例,展示了三维图形渲染的技术细节。 - **适用人群**:对Java 3D图形开发感兴趣的程序员...
### Java入门编程全解 #### 一、课程目标与概览 本书旨在为读者提供全面且深入的Java编程基础知识,不仅覆盖Java应用和Java Applets的面向对象编程所需的核心概念和技术,还包括Java语言语法、面向对象的基本原理...
3. **安全性**:Java设计时就注重安全,通过沙箱模型、异常处理机制等多种方式确保应用程序的安全运行。 4. **适用范围**:由于其执行速度的原因,Java不太适合图形用户界面(GUI)应用,但对于服务器端应用、企业级...
【Java编程基础入门教程 - Applet章节概览】 在Java编程世界中,Applet是一种特殊类型的应用程序,它能够在Web浏览器环境下运行。本教程的第9章深入讲解了Applet的相关知识,旨在帮助初学者理解Applet的工作原理、...
- 安全性:Java 设计了许多安全特性,如沙箱模型,防止恶意代码。 1.1.3 工作原理 - Java 虚拟机(JVM):JVM 是Java程序运行的核心,负责解释和执行字节码。 - 垃圾回收机制:自动管理内存,避免程序员手动释放,...
### Java入门教程知识点详解 #### 一、Java语言特点 Java是一种高级编程语言,自1995年由Sun Microsystems发布以来,迅速成为了全球最流行的编程语言之一。Java的设计初衷是简单、面向对象、健壮、安全、独立于...
### JAVA入门教程知识点详解 #### 一、Java的定义与特性 **1.1 Java的定义** - **语言**: Java是一种计算机编程语言,用于人与计算机之间的交流。 - **编程**: 将人类的需求和想法转化为计算机能够理解的形式,即...
这部分解释了Java沙箱的工作原理及其重要性。 #### 1.4 安全调试 介绍了如何在开发过程中进行安全相关的调试工作,以确保程序的安全性。 #### 1.5 总结 对本章的主要内容进行了回顾和总结。 ### 第2章:默认...
### Java SE 6 平台入门到精通 #### 核心知识点概览 - **Java SE 6 平台概述** - **Java SE 6 的新特性与改进** - **面向对象编程基础** - **核心类库详解** - **Swing GUI 编程** - **AWT GUI 编程** - **事件...