使用Java创建沙盒插件可扩展应用程序

时间:2012-06-20 16:54:04

标签: java security plugins

问题与this one非常相似,但我需要专注于不同的问题。

假设我有一个带有大型数据库(即电影数据库)的应用程序。应用程序的用户应该能够添加自己的插件并能够运行它们。

场景可能如下所示:

  • 启动主应用
  • 将stats-plugin.jar放在/ app / plugins目录中
  • 告诉主应用加载新插件
  • 告诉应用程序列出插件
  • 选择一个插件(例如刚刚安装的插件)并运行它
  • stats-plugin.jar查询有关电影的数据库并计算恐怖电影,返回计数
  • 主应用程序显示结果


每个插件可以有几个标准方法(一个通用的Plugin接口),可以调用,例如onInitializeonRun等。

主要应用程序需要保证的是,如果插件崩溃(例如除以0),主应用程序将保持稳定(例如,将显示错误对话框,但不会自行崩溃)。还应该可以限制执行时间并检查插件执行的操作。

这一切都归结为沙盒插件环境。最重要的是:插件样式的可扩展性和沙盒插件 - 只允许安全操作(例如读取数据库,但不更新它)。

该插件不必用Java编写。它需要以某种方式可执行 ......它甚至可以是一个JavaScript文件......如果可能的话。

你将如何处理这样的任务?

4 个答案:

答案 0 :(得分:1)

您应该考虑使用Security Manager,并可能定义一些自己的权限。在定义策略时,您可以使用一组常用权限。

请注意,对RDBMS的只读访问不太可能在Java环境的范围内。相反,这通常使用具有特定权限的单独RDBMS用户来处理。您的框架需要使用该用户名连接到数据库。

答案 1 :(得分:1)

可以使用您自己的安全策略文件和您自己的安全管理器来执行此类操作。基本上,授予您自己的罐子AllPermission和插件罐子的权限较少。这样,您将无法限制不受信任的applet可用的操作,因此编写创建无限循环或分配100GB RAM的线程仍然是可能的。

为了允许数据库访问但只允许特定操作,您必须提供自己的API(位于您的一个受信任的Jars中),它将仅提供可信操作(如首先验证SELECT语句),然后调用AccessController.doPrivileged如果可信任则执行操作。由于不受信任的代码可能无法打开套接字连接(除非特定主机允许),否则代码将无法以这种方式破坏数据库。

然而,正确实现安全管理器可能很棘手(实现中经常会发现错误,比如最近在Batik Squiggle中),因此使用模拟语言(例如JavaScript / Rhino)可能更安全。

答案 2 :(得分:0)

您可以使用Java Authentication and Authorization Service实现这种可插拔架构。使用JAAS,您可以执行具有受限访问控制权限的插件。 ACL可以限制打开套接字连接,写入文件,打开数据库连接等,

对于数据库访问,您可以通过JNDI数据源提供与插件的数据库连接,并使用只能读取数据库而不更新数据库的数据库用户配置数据源。

答案 3 :(得分:-2)

我认为java不适合运行不受信任的插件。插件运行后,它将能够完成主机程序可以执行的所有操作。

您需要创建自己的抽象层和沙盒“安全”操作 作为主程序的一部分执行。该插件可以提供您解释的数据 作为一个程序。你不能让这个插件运行。