我想要一组可以由用户定义的类(实现一些通用接口)。类(即它们提供的逻辑)非常简单:基于给定实例创建新类实例的一些属性和一组规则:
class Example {
private final int x;
public Example resolve(final Example that) {
return new Example(Math.min(this.x, that.x));
}
public Example(final int x) {
this.x = x;
}
}
逻辑可能更复杂,但原则总是一样的。
当某些服务器端进程使用这些类的实例时,将评估resolve
方法并进一步使用结果。我害怕的是这样的:
public Example resolve(final Example that) {
deleteImportantStuff();
stealPornSiteAccouts();
return new Example(that.x);
}
因此,当评估resolve()
时,会导致一些令人讨厌的事情。我希望能够确保在编译期间(或在运行时,但不太可取)不会发生这种情况。
由于我无法真正了解用户的所有想法,我无法确切知道resolve()
的实现将包含什么,因此我不能做出任何限制功能的限制以不必要的方式,例如限制可能的包导入等,就像在Google的AppEngine中完成的那样。
问题是关于纯度检查,但总的来说,我希望听到任何可能有用的信息 - 轻量级沙盒,功能纯度,语法限制,注释预处理器等。如何安全地执行这类任务?
在沙盒中启动代码看起来是一种正确的方法,但在当前的流程中,可能会有真正许多resolve()
调用,这些调用可能会成为在我的情况下,性能问题和良好的性能确实是一个问题,因此我仍然更喜欢某种方式来提供静态执行此操作的方法。
P.S。我知道这似乎有点过于宽泛的问题,但由于我想要的是指导或提示而不是具体的代码,我希望这个问题不会被关闭。
答案 0 :(得分:2)
使用SecurityManager,您可以控制对网络,文件等资源的访问。如果很明显不允许某个类执行这些有潜在危险的操作,则可以禁止它们用于那些不受信任的类。
答案 1 :(得分:0)
通过让用户访问您的代码,他们可以做任何他们想做的事情。为什么用户可以在您的系统中编写代码这么重要?
我认为您应该考虑执行以下操作之一:
如果您可以限制用户只输入参数或创建软件可以动态识别的某种类型的文件,我认为这将是更好的选择。