java安全实践

一、policy编写问题

环境:window8.1,jdk7   

直接附上测试代码:

public class PermissionTest {
	public static void main(String[] args) {
		OutputStream os = null;
		try {
			os = new FileOutputStream("hehe.txt");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			if(os != null) {
				try {
					os.close();
					os = null;
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
}

我们知道在默认的情况下,java应用程序是不安装安全管理器的,所以这段代码是可以正常执行。安装安全管理器有两种方法:

    (1)在代码中添加:System.setSecurityManager(new SecurityManager());

    (2)java -Djava.security.manager -Djava.security.policy=策略文件位置 PermissionTest

首先,若不指定策略文件,会报入如下异常:


然后,指定策略文件,myPolicy.policy文件内容如下:

grant codeBase "file://F:/dev/java/notepad/permission/" {
	permission java.io.FilePermission "F:\\dev\\java\\notepad\\-", "read,write";
};

按照java核心技术,策略文件的编写需要注意两点:

     (1)codeBase路径问题,codeBase中的路径总是以斜杠作为文件分隔符,即使是Windows中的文件路径。如果codeBase中的路径以"/"结束,则表示一个目录,负责被视为一个jar文件名字

     (2)指定文件权限(FilePermission)时的目标路径

按照书上说的,myPolicy.policy内容应该是正确的,执行结果仍然报上面的异常。为什么呢??百度、google没得到答案,自己鼓捣鼓捣,终于找到原因~原因就是file:后面不能要"//",修改如下:

grant codeBase "file:F:/dev/java/notepad/permission/" {
	permission java.io.FilePermission "F:\\dev\\java\\notepad\\-", "read,write";
};

最终,正确执行。看来是在windows下指定codeBase时,file后面不能要"//"


二、policy文件路径问题

    直接代码:

public class PermissionTest {
	public static void main(String[] args) {
		
		System.setProperty("java.security.policy", "myPolicy.policy");
		System.setSecurityManager(new SecurityManager());
		
		OutputStream os = null;
		try {
			os = new FileOutputStream("hehe.txt");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			if(os != null) {
				try {
					os.close();
					os = null;
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
}

   对于System.setProperty("java.security.policy", "myPolicy.policy"),我们知道myPolicy.policy使用的是相对路径,即去当前目录下找myPolicy.policy文件。 如果不使用eclipse等ide工具,将myPolicy放当前目录下,没有问题。目录如下:

   

    然而,若使用myeclipse等ide工具,不能将myPolicy.policy文件放src目录下,而是要放到工程目录下。目录结构如下:


    按常规理解:myPolicy.policy放src目录下,编译后会和class文件一起放到bin目录下,应该可以执行,干嘛要放到工程目录下呢?猜测:myeclipse将bin目录看为是classpath路径,myPolicy.policy等采用相对路径的文件需和bin(即classpath)在同一目录下才可被访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值