感谢原作者
最近做的项目有一个特殊的需求,由于系统是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来做。