自定义java.policy配置(如何让你的类禁止读写文件?禁止创建Socket对象?)

本文介绍了如何通过自定义java.policy文件来限制Java程序的权限,防止客户端上传的类文件执行恶意代码,如读写文件和创建Socket。通过开启SecurityManager,修改默认的java.policy,指定自定义策略文件,以及配置特定的权限,可以实现对特定类的运行控制,确保服务器安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做的项目有一个特殊的需求,由于系统是CS的,客户端需要自己编写JAVA类上传至服务器运行,整个流程如下:

1.客户端编写JAVA类,并实现特定接口

2.由客户端的JAVA编译器将其编译成class

3.客户端通过socket将class文件上传至服务器

4.服务器将class文件放至自己的classpath中,加载并执行

问题出在最后一步上,服务器虽然由我们完全控制,客户端编写的类虽然需要实现特定的接口,但执行具体内容不在我们控制范围内。也就是说,客户端上传的类中,完全可能写一段程序,读取服务器的所有文件,然后上传给另一台客户端可控制的机器上,这样就很容易地窃取了我们的整个系统。为了避免这种情况,能想到的解决方案有:

1.服务器接收到客户端上传的class后,不立即执行,而是增加一个审核的步骤,当上传的class通过审核后,才能够执行

2.让客户端上传的class在独立的沙箱中运行,类似于applet

第一种方案理论上是可行的,但是审核的步骤靠程序来实现相当困难,你需要先反编译class,然后再检查里面是否有类似file.listFiles(),reader.read(byte[] arr)这样的调用,这几乎无法实现。因为JAVA读取文件的方式有很多种,并且创建对象的方式也有很多种,可以直接new,也可以使用反射去创建,甚至调用读取方法也不直接调用,而使用反射去调,你如何使用程序去检查呢?那么能不能把审核的这一步骤交给人来做呢,安排一工作人员在class上传后先看看里面有没有恶意代码。这当然是可以的,但不是多出一个人员成本了吗?

第二种方案是比较理想的,即把你想控制的访问权限通过配置的方式告诉JVM,剩下的工作交给JVM来做。

虽然有了方向,但由于以前没有做过类似的功能,所以决定先上网搜一把。搜索的关键字为“java.policy配置”或“java沙箱模型”。不过很遗憾,文章虽然有很多,但经过自己动手测试才发现,写文章的人几乎没有人真正实践过,要么互相抄袭,要么就是随便翻译一下国外的文章。没办法,还是看JDK的文档吧,原文地址如下:

http://docs.oracle.com/javase/1.5.0/docs/guide/security/PolicyFiles.html

虽然写的不是很详细,但还算到位,关键的地方都写到了。经过一番摸索,终于实现了我想要的功能,客户端上传的代码如果有读写文件或者创建socket对象的操作,程序就会报权限不足的错误。这个功能的实现不需要修改服务器的代码,实在是太棒了。现将主要步骤分享如下:

1.启动SecurityManager开关

默认情况下,JVM是不启动安全检查的,所以要想让程序在沙箱中运行,必须将开关打开。打开的方式有两种,一种是在启动运行中追加JVM参数-Djava.security.manager,还有一种方式是在程序中直接设置:System.setSecurityManager(new SecurityManager());,这两种方式是等价的

2.修改jvm自带的java.policy文件,

java.policy文件位于%JAVA_HOME%/ jre/lib/security/下,默认内容如下:

// Standard extensions get all permissions by default

grant codeBase "file:${
  {java.ext.dirs}}/*" {
	permission java.security.AllPermission;
};

// default permissions granted to all domains

grant { 
	// Allows any thre
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值