我正在开发一个允许用户执行自定义Scala代码的在线环境(将其视为持续集成)。但是,我想阻止他们做某些事情,最明显的是文件I / O和网络调用。我将允许这些函数的有限形式与我将公开的库。
天真的方法是简单地用空字符串替换/^import.*$/
。然而,对于邪恶的人来说,有很多方法可以解决这个问题,包括类加载器等。我希望用户只能访问预先选择的“白名单”导入,而不必依赖(可能不完整)黑名单。
我还没有决定是否要在底层操作系统上使用他们的文件调用scalac
,或者是否使用IMain
来解释文本。显然,如果一种方法使我想要的结果可行,我会选择那个。 奖励积分,如果您的答案包含
如何有效地沙箱化用户代码?
答案 0 :(得分:3)
有两个不同的问题:编译时和运行时沙盒。
运行时沙盒可以通过使用Java安全性和类加载器限制来完成 - 请参阅例如How do I create a Java sandbox?,更加谨慎,Can I trust Java SecurityManager sandbox?。关于这个话题还有更多内容!
对于Scala编译时沙箱,我不得不推迟。但是,我想知道你是否需要它。如果只有那些尝试使用禁用API的人是那些试图侵入你的系统的人,那么没有理由通过提供编译时检查来使他们的工作变得更容易。