我们必须开发一款用户可以上传代码的游戏,例如Rock Paper Scissor。他们必须从接口类实现一些方法,我们在游戏类中调用它们,没什么特别的。
用户的代码在包中,我们没有名称冲突,
但是对于主题:我们如何确保,用户A不会从用户B的类中调用方法?
答案 0 :(得分:3)
一种方法是在不同的类加载器中加载这两个类。为了完全安全,您还需要在安全沙箱中运行这些类,以防止反射和其他可能绕过类加载器障碍的机制。
实际上,我认为这可能存在缺陷。如果两个“播放器”类实现相同的接口,则它们可以多态调用共享接口中定义的方法。事实上,它们被加载到不同的类加载器中,因此不能使用彼此的类型并不能阻止它。
因此,您基本上依赖于阻止反射(以及良好的编程)来防止一个类/对象驱逐另一个类的实例。阻止反射还会阻止一个类破坏另一个类的封装,或者调用未在公共超类或共享接口中定义的方法。
答案 1 :(得分:0)
答案 2 :(得分:0)
如果你在程序中包含并运行一些elses代码,那么没有什么能阻止他们调用你的方法。
你可以让你的方法包私有并密封包装,等等,但你仍然需要处理反射等。
如果我在哪里,我会考虑通过明确定义的网络协议或标准输入/输出与用户代码连接。
答案 3 :(得分:0)
一种简单的方法是确保所有方法都有protected
或default
access modifier,以便包外的任何人都无法访问它们。
答案 4 :(得分:0)
这些都是猜测,但请看:
或者,您可以让用户上载脚本而不是真正的Java代码,例如您可以使用Rhino运行的ECMAScript。
答案 5 :(得分:0)
你不能,只要那些是公共方法,除非你在不同的类加载器中隔离,在这种情况下每个类都看不到对方。
在不同的类加载器中加载Web容器(如Tomcat,Jetty等)如何隔离不同的Web应用程序。
另一种方法可能是设置自定义安全实现,但要比类加载器解决方案更难做到。