11

我希望运行一些未经验证的脚本(用尚未确定的语言编写,但需要基于 Java,因此 JRuby、Groovy、Jython、BeanShell 等都是候选者)。我希望这些脚本能够做一些事情并限制做其他事情。

通常,我会使用 Java 的 SecurityManager 并完成它。这非常简单,让我可以限制文件和网络访问、关闭 JVM 的能力等。这对于我想要阻止的高级内容非常有效。

但是我想允许一些东西,但只能通过我提供的自定义 API/库。例如,我不想允许直接网络访问打开到 yahoo.com 的 URLConnection,但如果使用 MyURLConnection 完成,我可以。那就是 - 有一组我想要允许的方法/类,然后是我想要禁止的所有其他内容。

我不相信这种类型的安全可以用标准的 Java 安全模型来完成,但也许可以。我对脚本语言本身的性能或灵活性没有特定要求(脚本将是对我的 API 的简单程序调用,具有基本的循环/分支)。因此,即使是对每个反射调用进行安全检查的“大”开销对我来说也是可以的。

建议?

4

3 回答 3

4

免责声明:我不是 Java 安全 API 方面的专家,因此可能有更好的方法来做到这一点。

我为基于 Java 的开源企业 CMS的Alfresco工作,我们实现了与您描述的类似的东西。我们希望允许编写脚本,但只向脚本引擎公开我们的 Java API 子集。

我们为 JavaScript 脚本选择了 Rhino Engine。它允许您控制哪些 API 向 JavaScript 公开,这允许我们选择哪些类可用,哪些不可用。根据我们的工程师的说法,开销约为 10% - 还不错。

除此之外,这也可能与您相关,在 Java 方面,我们使用 Acegi(现在的 Spring Security),并使用 AOP 对特定用户可以调用的方法进行基于角色的控制。这对于授权非常有效。因此,实际上,通过 JavaScript 访问我们应用程序的用户首先有一个受限的 API 可供他使用,然后可以根据授权进一步限制该 API。因此,您可以使用 AOP 技术进一步限制可以调用的方法,从而允许在其他脚本语言中公开它,例如 Groovy 等。我们也在添加这些,相信我们的底层 Java API 保护用户免受未经授权的访问。

于 2009-02-09T21:29:24.157 回答
3

您可以使用自定义类加载器,在委托给其父级之前执行链接到类的审核。

您可以创建自己的权限,检查安全敏感 API 中的权限,然后AccessController.doPrivileged在调用底层 API 时使用它来恢复适当的权限。

您需要确保脚本引擎本身是安全的。Sun JDK 中的 Rhino 版本应该没问题,但不能保证。显然,您需要确保脚本可用的所有内容都是安全的。

于 2009-02-09T22:16:23.403 回答
0

在 Groovy 中,您可以完全按照您提到的方式进行操作。其实很容易。您可以轻松地限制在受信任环境中运行的不受信任脚本的权限,允许使用您自己的 api,这反过来又可以做不受信任的事情。

http://www.chrismoos.com/2010/03/24/groovy-scripts-and-jvm-security/

于 2014-02-12T10:19:29.107 回答