java的能够成为众多企业中应用广泛的语言,除了完善,强大的功能之外,重要的还有它的安全性.
java设计了从程序编写,编译,类加载过程,执行的每一步都进行安全检查.
这里简要说一下java的安全管理器和访问权限
"安全管理器是负责控制某个操作是否允许执行的类."
安全管理器负责检查的操作包括一下几个:
整个java类库中还有许多其他类似的检查.
需要注意的是,在运行java应用程序是,默认的设置是不安装安全管理器的,这样所有的操作都是允许的.另一方面,applet浏览器会执行一个功能受限的安全策略.
它的安全策略建安里了代码来源和访问权限集之间的映射关系.
以文件访问权限为例
安全策略文件
策略类需要读取响应的安全策略文件,这些文件包含了将代码来源映射为权限的指令.
在我们的jdk中默认有两个地方可以安装安全侧路文件:
java平台主目录的java.policy文件
用户主目录的.java.policy文件(注意文件名前面的圆点)
注意:可以在java.security配置文件中修改这些文件的位置,默认位置设定为
policy.url.1=file:${java.home}/lib/security/java.policy
policy.url.2=file:${user.home}/.java.policy
另外一种方式是为每一个应用程序配置显示的策略文件.
(策略文件格式参考官方文档
)
启用策略文件有两种方法,一种是在应用程序的main方法内部设置系统属性:
1.
System.setProperty("java.security.policy", "app.policy");
2. 虚拟机命令行启动参数
java -Djava.security.policy=app.policy App
对于applet
applietviewer -J-Djava.security.policy=app.policy applet.html
在这些例子中,app.policy文件被添加到了其他有效的策略中.如果再命令行中添加了第二个等号,比如:
java -Djava.security.policy==app.policy App
那么应用程序就只是用指定的策略文件,而标准的策略文件将被忽略.
前面说,默认java是不安装安全管理器的.因此,在安装安全管理器之前,看不到策略文件的作用.
所以启用要启用安全管理器,一可以在main方法中添加:
System.setSecurityManager(new SecurityManager());
或者在启动虚拟机的时候添加命令行选项-Djava.security.manager
java -Djava.security.manager -Djava.security.policy=app.policy App
针对文件访问file permission
java.io.FilePermission 有read, write, execute 和delete四个操作
另外一个注意的地方是:
代码总是可以读取自身所在目录(或该目录的子目录)中的文件,不需要对其进行显式授权。(since JDK API 1.2)
就是说默认情况下代码总是对自身目录的文件有可读权限,但是其他write, execute 和delete权限是没有的.
"每个类都有个保护域,它是用于封装类的代码来源和权限集合的对象.当SecuritManager类需要检查某个权限是,它要检查看当前位于调用堆栈上的所有方法的类,然后它获得所有类的保护域,并且询问每个保护欲,该域的权限集合是否允许执行当前正在被检查的操作.如果所有的域都同意,那么检查得以通过.否则,就会抛出一个SecurityManager异常."
这里我和搭档的测试方法是测试应用程序目录的上一个目录中的一个目录的权限.
策略文件和应用程序文件在同一目录
PermissionTest.policy
grant {
permission java.util.PropertyPermission "user.dir", "read";
permission java.io.FilePermission "../test", "write";
};
需要说明的是,user.dir 这个property的读权限因为需要在应用程序中获得上级目录需要使用的java.io.File的方法,但是在执行过程中出现报错,user.dir不可读.所以应该是File的方法使用到了user.dir这个property,所以在这里也把这个权限加上.
响应的java.util.PropertyPermission权限可参考java目录中的java.policy文件响应内容,注意其中并没有user.dir属性目标.
同时,我们对测试程序本身目录中的文件进行了测试.
测试程序
PermissionTest.java
import java.io.FilePermission;
import java.io.File;
public class PermissionTest {
public static void main(String[] args) {
SecurityManager manager = System.getSecurityManager();
File f = new File("");
System.out.println(System.getProperty("user.dir"));
System.out.println(f.getAbsoluteFile().getParent());
try{
manager.checkRead("../test");
System.out.println("读权限可用!");
} catch (SecurityException e) {
System.out.println("读权限不可用!");
System.out.println(e.getMessage());
}
try{
manager.checkWrite("../test");
System.out.println("写权限可用!");
} catch (SecurityException e) {
System.out.println("写权限不可用!");
System.out.println(e.getMessage());
}
try{
manager.checkDelete("../test");
System.out.println("删除权限可用!");
} catch (SecurityException e) {
System.out.println("删除权限不可用!");
System.out.println(e.getMessage());
}
try{
manager.checkExec(f.getAbsoluteFile().getParent() + File.separator + "test");
System.out.println("执行权限可用!");
} catch (SecurityException e) {
System.out.println("执行权限不可用!");
System.out.println(e.getMessage());
}
System.out.println("=======检查应用程序本身目录文件权限=======");
try{
manager.checkRead("TEM");
System.out.println("TEM 读权限可用!");
} catch (SecurityException e) {
System.out.println("TEM 读权限不可用!");
System.out.println(e.getMessage());
}
try{
manager.checkWrite("TEM");
System.out.println("TEM 写权限可用!");
} catch (SecurityException e) {
System.out.println("TEM 写权限不可用!");
System.out.println(e.getMessage());
}
try{
manager.checkDelete("TEM");
System.out.println("TEM 删除权限可用!");
} catch (SecurityException e) {
System.out.println("TEM 删除权限不可用!");
System.out.println(e.getMessage());
}
try{
manager.checkExec(System.getProperty("user.dir") + File.separator + "TEM");
System.out.println("TEM 执行权限可用!");
} catch (SecurityException e) {
System.out.println("TEM 执行权限不可用!");
System.out.println(e.getMessage());
}
System.out.println("Fine.");
}
}
还需要说明的是检查执行权限的checkExec方法,参见JDK API
public void checkExec(String cmd)
……
如果 cmd 是绝对路径,那么此方法使用 FilePermission(cmd,"execute") 权限调用 checkPermission,否则用 FilePermission("<<ALL FILES>>","execute") 权限调用 checkPermission。
……
所以,checkExec需要使用绝对路径文件来调用.
当然可以通过checkPermission(Permission p)来检查,这样就不涉及到绝对路径的问题.
命令行执行测试:
java -Djava.security.manager -Djava.security.policy==PermissionTest.policy PermissionTest
修改policy文件及测试程序,可以看到不同权限的变化.
--参考资料《JAVA核心技术(Core Java)》原书第8版
分享到:
相关推荐
"使用Policy文件来设置Java的安全策略...本文档讨论了使用Policy文件来设置Java的安全策略,涵盖了Java安全策略的概念、Policy文件的格式、keystore记录和grant记录等内容,为读者提供了一个详细的Java安全策略知识点。
**标题解析:** "JCE无限制权限策略文件" 指的是Java Cryptography Extension (JCE) 的不受限安全策略文件。JCE是Java平台的一部分,用于提供高级加密算法和技术,如RSA、AES等。在默认情况下,JCE会限制用户能够...
Java安全权限控制机制是Java安全体制中的一种重要机制,通过对Java安全管理器、权限类、安全策略文件、自定制权限类等底层技术的研究,程序员可以细致的控制各个安全访问权限。 Java安全管理器(SecurityManager)...
总的来说,Java Cryptography Extension (JCE) 无限强度权限策略文件是Java开发中的一个关键工具,它扩展了Java平台的加密能力,使得开发者能够在满足安全性需求的同时,也能应对不同国家和地区的法规要求。...
早期的Java安全模型主要基于权限、安全策略文件、安全管理器(Security Manager)来控制不同来源代码的权限。这种安全模型在防止恶意代码执行方面起到了积极作用,但也存在着灵活性不足、不易管理等缺点。随着Java...
在Java中,权限管理基于Java安全模型,该模型通过类加载器和安全策略来实现。下面将详细介绍Java权限控制的相关知识点。 1. **Java安全模型**: Java安全模型是Java平台的基础,它定义了如何限制代码的执行权限。...
1. **Java安全模型**:Java的安全模型始于“砂箱”机制,最早在JDK 1.0版本中引入,用于限制不受信任的远程代码的执行权限。随着版本升级,如JDK 1.1增加了对签名Applet的支持,JDK 1.2则引入了可配置的安全策略,...
描述中的“有需要的同学可以自由下载”,暗示了这个代码库可能是教育性质的,旨在帮助学习者理解并实践Java安全机制。 在Java中,安全管理器(SecurityManager)是控制权限的核心组件。如果一个应用程序设置了安全...
在Java编程领域,权限设计是构建安全应用程序的关键组成部分。它涉及到如何管理用户访问资源的权限,确保只有授权的用户或系统组件能够执行特定的操作。在这个主题中,"java用户权限设计"涵盖了多个重要知识点,包括...
在Java编程语言中,权限管理是系统安全的重要组成部分,它涉及到如何控制不同用户或程序对资源的访问。本文将深入探讨Java中的权限实现,...通过学习和实践这样的实例,开发者能够提升对Java安全特性的理解和应用能力。
8. **源码分析**:作为学习参考,我们可以研究源码来了解其设计模式,如工厂模式、策略模式等在权限控制中的应用,以及如何使用Jaas或其他安全库实现具体功能。 总之,这个名为`jsecurity-0.9.0`的Java权限控制插件...
Apache Shiro是一个强大的、易用的Java安全框架,提供了身份认证、授权、会话管理和加密等功能。在这个系统中,Shiro负责处理用户的登录验证,根据用户的角色和权限进行访问控制,确保只有拥有特定权限的用户才能...
"jdk1.8.0_131和JCE无限制权限策略文件" 这个标题指的是Java Development Kit (JDK) 的一个特定版本——1.8.0_131,以及与之相关的Java Cryptography Extension (JCE) 无限制权限策略文件。JCE是Java平台的一个组件...
设计合理的权限策略是关键。可以采用基于资源的权限控制(Resource-Based Permissions)、基于职责的权限控制(RBAC)、基于属性的访问控制(ABAC)等不同模型,根据项目需求选择合适的方法。 9. **权限缓存**: ...
1. **Java安全模型**:Java的安全模型基于沙箱机制,它限制了代码(尤其是来自不可信源的代码)的执行权限,以防止恶意行为。理解这个模型是确保代码安全的基础。 2. **类加载器与权限**:Java中的类加载器负责加载...
Java安全性编程是Java平台的核心特性之一,它旨在保护应用程序免受恶意代码的攻击,并确保敏感信息的安全处理。这个压缩包包含的源代码很可能是不同章节关于Java安全性的实例和示例,涵盖了广泛的议题。让我们逐一...
Java安全管理器(Security Manager)负责检查运行时的权限。 4. **Java Security Manager**:这是Java平台的一部分,用于限制应用程序的某些操作,如读写文件、网络连接等,以提高系统的安全性。 5. **权限...
Java 后台权限控制是构建安全的Web应用中不可或缺的一部分,它确保了用户只能访问他们被授权的操作和数据。在Java开发中,Apache Shiro是一个非常流行的安全框架,用于实现身份验证、授权(权限控制)、会话管理和...
JAVA安全编码规范参考文档深入分析了在Java开发中如何编写安全的代码,降低系统被攻击的风险。文档内容涵盖了安全编码的基本原则以及常见漏洞的安全编码方法。 一、安全编码基本原则 1. 所有输入数据都是有害的 在...
总结起来,"Java安全性编程实例"的主题涵盖了Java安全模型的各个方面,包括但不限于安全策略、访问控制、证书与签名、异常处理、API使用以及最佳实践。这份资料对于深入理解和应用Java安全机制,提升应用程序的安全...