1

We have to develope a game, where the user can upload their code, for example Rock Paper Scissor. They have to implement some methods from an interface class and we call them in our game Class, nothing special.

The code of the users are in packages, that we have no name-collision,
but to the main topic: How we can ensure, that user A don't call methods from the class of user B ?

4

6 回答 6

3

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


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

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

于 2011-08-04T09:57:34.133 回答
0

看看http://download.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

于 2011-08-04T09:57:08.800 回答
0

如果您在程序中包含并运行其他代码,则没有什么能阻止它们调用您的方法。

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

如果我在你那里,我会考虑通过定义良好的网络协议或通过标准输入/输出与用户代码交互。

于 2011-08-04T09:57:15.403 回答
0

一种简单的方法是确保所有方法都具有protectedordefault 访问修饰符,以便包外的任何人都无法访问它们。

于 2011-08-04T09:58:00.120 回答
0

这些都是猜测,但请注意:

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

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

于 2011-08-04T09:58:35.463 回答
0

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

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

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

于 2011-08-04T09:58:49.770 回答