时间:2011-08-04 09:53:51

标签: java class packages names

我们必须开发一款用户可以上传代码的游戏,例如Rock Paper Scissor。他们必须从接口类实现一些方法,我们在游戏类中调用它们,没什么特别的。

用户的代码在包中,我们没有名称冲突,
但是对于主题:我们如何确保,用户A不会从用户B的类中调用方法?

6 个答案:

答案 0 :(得分:3)

一种方法是在不同的类加载器中加载这两个类。为了完全安全,您还需要在安全沙箱中运行这些类,以防止反射和其他可能绕过类加载器障碍的机制。


实际上,我认为这可能存在缺陷。如果两个“播放器”类实现相同的接口,则它们可以多态调用共享接口中定义的方法。事实上,它们被加载到不同的类加载器中,因此不能使用彼此的类型并不能阻止它。

因此,您基本上依赖于阻止反射(以及良好的编程)来防止一个类/对象驱逐另一个类的实例。阻止反射还会阻止一个类破坏另一个类的封装,或者调用未在公共超类或共享接口中定义的方法。

答案 1 :(得分:0)

答案 2 :(得分:0)

如果你在程序中包含并运行一些elses代码,那么没有什么能阻止他们调用你的方法。

你可以让你的方法包私有并密封包装,等等,但你仍然需要处理反射等。

如果我在哪里,我会考虑通过明确定义的网络协议或标准输入/输出与用户代码连接。

答案 3 :(得分:0)

一种简单的方法是确保所有方法都有protecteddefault access modifier,以便包外的任何人都无法访问它们。

答案 4 :(得分:0)

这些都是猜测,但请看:

  • 安全经理
  • 检查字节码是否存在非法操作(例如使用ASM)
  • 每个游戏的单独类加载器

或者,您可以让用户上载脚本而不是真正的Java代码,例如您可以使用Rhino运行的ECMAScript。

答案 5 :(得分:0)

你不能,只要那些是公共方法,除非你在不同的类加载器中隔离,在这种情况下每个类都看不到对方。

在不同的类加载器中加载Web容器(如Tomcat,Jetty等)如何隔离不同的Web应用程序。

另一种方法可能是设置自定义安全实现,但要比类加载器解决方案更难做到。